Daniel Ehrenberg和Jeff Morrison提出了名为“静态类功能”的第3阶段ECMAScript提案,旨在解决此问题。连同第3阶段“类字段”提案,未来的代码将如下所示:
class MyClass {
static myStaticProp = 42;
myProp = 42;
myProp2 = this.myProp;
myBoundFunc = () => { console.log(this.myProp); };
constructor() {
console.log(MyClass.myStaticProp);
console.log(this.myProp);
this.myBoundFunc();
}
}
以上等同于:
class MyClass {
constructor() {
this.myProp = 42;
this.myProp2 = this.myProp;
this.myBoundFunc = () => { console.log(this.myProp); };
console.log(MyClass.myStaticProp);
console.log(this.myProp);
this.myBoundFunc();
}
}
MyClass.myStaticProp = 42;
Babel 支持通过@ babel / plugin-proposal-class-properties(包含在Stage-3预设中)来转换类字段,因此即使您的JavaScript运行时不支持此功能,您也可以使用它。
与@kangax声明getter的解决方案相比,该解决方案还可以实现更高的性能,因为此处直接访问该属性,而不是通过调用函数来访问。
如果该建议被接受,那么将有可能以与传统的面向对象语言(如Java和C♯)更相似的方式编写JavaScript代码。
编辑:统一的类字段提案现在处于阶段3;更新到Babel v7.x软件包。
编辑(2020年2月):静态类功能已拆分为其他提案。谢谢@ GOTO0!