关注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
我有两个问题:
this.foo
可以正常工作,虽然我不创建此类的实例?答案 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 = ...
的示例。但是,除非您清楚地了解原因,否则不要使用它。