我无法找到有关如何使用(相对较新的)类语法在JavaScript中定义静态数据成员的任何信息。它甚至可能吗?请参阅以下示例代码:
class Foo {
constructor() {
this.name = 'Default Name for each Instance';
// staticData1 = 'Static Data 1'; // syntax error
let staticData2 = 'Static Data 2'; // undefined outside
}
doSthSpecial() {
console.log('Executing a method from instance "' + this.name + '"');
}
static doSthStatic() {
console.log('Executing a method that does the same for each instance of "Foo"');
}
}
foo = new Foo();
console.log(foo.name);
foo.doSthSpecial();
Foo.doSthStatic();
// The problematic case:
console.log(Foo.staticData2);
答案 0 :(得分:3)
这很有效,它可以将凌乱的细节保留在课堂内。
class cExample
{
static init_index() {
cExample.index = 0;
}
static get_index() {
return ++cExample.index;
}
}
cExample.init_index();
example = new cExample();
console.log(cExample.get_index()); // 1
example = new cExample();
console.log(cExample.get_index()); // 2
example = new cExample();
console.log(cExample.get_index()); // 3
答案 1 :(得分:2)
在定义Foo之后,您可以使用Foo.staticData2 = 'Static Data 2'
来定义类Foo的静态数据成员。
根据ES6,类定义中没有静态属性,只有静态方法。
在ES7中,有一个关于静态字段定义的提议,目前它处于第2阶段(https://github.com/tc39/proposal-class-public-fields)。好消息是:Babel支持这一提议(https://babeljs.io/docs/plugins/transform-class-properties/)。
答案 2 :(得分:1)
我找到了一个非常接近所要求的解决方法。可以使用计算属性(“get方法”)并将其设置为静态。然后就不需要“()”函数/方法调用语法,并且它可以在没有该类的任何实例的情况下使用。虽然可能效率稍低。 例如:
let Foo = class {
static get staticData() {
return 'Static Data';
}
}
console.log(Foo.staticData);
答案 3 :(得分:1)
另一种对我有用的解决方法,虽然不是最优雅的方法,但至少要等到ES7才在类之后找到静态成员:
class Field {
constructor(index) {
this.index = index;
}
getName(name) {
return this.name;
}
}
Field.DISPLAY_AS_TEXT = 2001;
Field.DISPLAY_AS_BARCODE = 2002;