JS类,静态字段和命名空间

时间:2018-02-25 10:00:22

标签: javascript ecmascript-6

关注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可以正常工作,虽然我不创建此类的实例?

4 个答案:

答案 0 :(得分:3)

  

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

如果您不想创建实例,请不要使用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()中的命名空间对象。

答案 1 :(得分:2)

this内的

static method只指向class,因此当您调用initialize时,会导致向该类添加属性foo而不是一个实例。这就是您在调用testMe

时定义的原因

答案 2 :(得分:1)

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

com.temp.System = {
  foo: 5,

  initialize() {
    console.log("foo 1 is: " + this.foo);
  },

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

答案 3 :(得分:0)

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

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