为什么要创建一个没有构造函数且用JavaScript中的静态方法填充的类?

为什么要创建一个没有构造函数且用JavaScript中的静态方法填充的类?,javascript,class,Javascript,Class,我正在阅读一个带有遗留代码的项目,我在这里发现了类似这样的简化: class FooUpdater { static getData() {} static someFunc() {} static otherFunc() {} static async init() {} } 我还注意到它从未被实例化。唯一的方法是在repo的另一部分中使用它foodupdater.init 虽然我不会更改这一部分,但我认为

我正在阅读一个带有遗留代码的项目,我在这里发现了类似这样的简化:

    class FooUpdater {
        static getData() {}

        static someFunc() {}

        static otherFunc() {}

        static async init() {}
    }
我还注意到它从未被实例化。唯一的方法是在repo的另一部分中使用它foodupdater.init

虽然我不会更改这一部分,但我认为它是一个更好的选择,即只拥有一个包含函数的对象。大概是这样的:

    const FooUpdater = {
        getData: () => {},
        someFunc: () => {},
        otherFunc: () => {},
        init: async () => {}
    };
结果是一样的,对吧


为什么这个人选择一个充满静态方法的无构造函数类,而不是一个包含函数的简单对象?可能是一种设计模式、性能或其他东西?

它保证类本身是一个独立的类。尝试运行以下命令:

class Foo {}

class Foo {}

这将抛出规范所保证的错误,而您的对象文本示例不具有该属性。当你通过导入或诸如此类的方式获得Foo时,你确切地知道你得到了什么。也就是说,我不喜欢它,单例代码本身就是一种语言,这对于Javascript来说是非常不习惯的。如果你真的想,你可以用默认的构造函数来实例化这个类,但那是毫无意义的。

它保证这个类本身是一个类。尝试运行以下命令:

class Foo {}

class Foo {}

这将抛出规范所保证的错误,而您的对象文本示例不具有该属性。当你通过导入或诸如此类的方式获得Foo时,你确切地知道你得到了什么。也就是说,我不喜欢它,单例代码本身就是一种语言,这对于Javascript来说是非常不习惯的。如果你真的想,你可以用默认的构造函数来实例化这个类,但那是毫无意义的。

这是一种限制命名空间污染的廉价方法,但我个人认为这真的很难看。它就像一个对象文字,没有函数是FooUpdater原型的一部分,不需要新的。你的直觉是正确的。以这种方式使用一个类是愚蠢的,当我看到它时,我的眼睛流血。在某些情况下,创建这样一个类可能是有意义的,但前提是对其进行了扩展。否则,一个目标显然是优越的。有人这样做的原因是他们不懂JavaScript。也有可能他们不想理解它。他们真的是这样的程序员。大概开发人员来自Java或C或类似的语言,所以他们用自己的母语编写代码。感谢所有的评论。这是一种限制命名空间污染的廉价方法,但我个人认为这真的很难看。它就像一个对象文字,没有函数是FooUpdater原型的一部分,不需要新的。你的直觉是正确的。以这种方式使用一个类是愚蠢的,当我看到它时,我的眼睛流血。在某些情况下,创建这样一个类可能是有意义的,但前提是对其进行了扩展。否则,一个目标显然是优越的。有人这样做的原因是他们不懂JavaScript。也有可能他们不想理解它。他们真的是这样的程序员。大概开发人员来自Java或C或类似的语言,所以他们用自己的母语编写代码。谢谢所有的评论。谢谢Jared!你同意问题下面的评论吗?请用你认为有用的数据来更新你的答案,我会选择它。java是的,很可能是来自Java的人。在Java中,类是您真正拥有的唯一抽象,因此将只有静态方法的类纯粹用作名称空间是非常常见的。它本身并没有错,但在Javascript中并不是必需的。@JaredSmith一个const和一个类在这个上下文中一样是一个单独的词,一个任意的词法范围,正如const Foo=class{}的等价性所证明的,谢谢Jared!你同意问题下面的评论吗?请用你认为有用的数据来更新你的答案,我会选择它。java是的,很可能是来自Java的人。在Java中,类是您真正拥有的唯一抽象,因此将只有静态方法的类纯粹用作名称空间是非常常见的。它本身并没有错,但在Javascript中并不是必需的。@JaredSmith在这个上下文中,const和类一样是一个单例,一个任意的词法范围,这可以从const Foo=class{}的等价性中得到证明