【问题标题】:JS classes, static fields and namespaceJS 类、静态字段和命名空间
【发布时间】:2023-04-09 06:14:01
【问题描述】:

按照这个solution我有以下课程:

com.temp.System = class {
    static initialize() {
        this.foo = 9;
        console.log("foo 1 is: " + this.foo);
    }

    static testMe() {
        console.log("foo 2 is: " + this.foo);
    }
}

我就是这样使用它的:

{
    const System = com.temp.System;
    System.initialize();
    System.testMe();
}

这是输出:

foo 1 is: 9
foo 2 is: 9

我有两个问题:

  1. 在此类解决方案中创建静态文件的最佳方法是什么?
  2. 为什么this.foo 有效,尽管我没有创建此类的实例?

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

在这种解决方案中创建静态字段的最佳方法是什么?

如果您不想创建 class 语法的实例,请不要使用它。

com.temp.System = {
//                ^ simple object literal
    initialize() {
        this.foo = 9;
        console.log("foo 1 is: " + this.foo);
    },
    testMe() {
        console.log("foo 2 is: " + this.foo);
    }
};

为什么this.foo 有效,尽管我没有创建此类的实例?

因为它不是实例属性。你已经创建了System.foo = 9。方法中的this 只是调用该函数的对象 - 在您的示例System.initialize() 中就是命名空间对象。

【讨论】:

    【解决方案2】:

    static method 中的this 仅指向class,因此当您调用initialize 时,它会导致将属性foo 添加到类而不是实例中。这就是为什么在您调用testMe时定义它的原因

    【讨论】:

      【解决方案3】:

      最好的方法是使用普通的旧对象字面量:

      com.temp.System = {
        foo: 5,
      
        initialize() {
          console.log("foo 1 is: " + this.foo);
        },
      
        testMe() {
          console.log("foo 2 is: " + this.foo);
        }
      };
      

      【讨论】:

        【解决方案4】:

        据我所知,有no such thing as static properties in ES6。然而,我想问的问题是不同的:为什么需要“静态类属性”?这与常量有什么不同,或者,如果需要从类外部访问,导出常量有什么不同?

        上面的链接提供了一个使用Object.defineProperty 或直接分配给类MyClass.static = ... 的“静态数据属性”的示例。但是,除非您清楚地了解原因,否则不要使用它。

        【讨论】:

        • 静态属性不是一成不变的...How is that different from a constant 它是明确的
        • @JonasW。你是对的,谢谢。我没有考虑可变性。
        猜你喜欢
        • 2011-12-09
        • 2012-08-10
        • 2013-03-10
        • 2012-05-27
        • 2012-11-20
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 2012-08-10
        相关资源
        最近更新 更多