从 ECMAScript 2022 开始,您可以执行以下操作,类似于 Java 和 C# 等传统的面向类的语言:
class MyClass {
static myStaticProp = 42;
myProp = 42;
myProp2 = this.myProp;
myBoundFunc = () => { console.log(this.myProp); };
constructor() {
console.log(MyClass.myStaticProp); // Prints '42'
console.log(this.myProp); // Prints '42'
this.myBoundFunc(); // Prints '42'
}
}
以上等价于:
class MyClass {
constructor() {
this.myProp = 42;
this.myProp2 = this.myProp;
this.myBoundFunc = () => { console.log(this.myProp); };
console.log(MyClass.myStaticProp); // Prints '42'
console.log(this.myProp); // Prints '42'
this.myBoundFunc(); // Prints '42'
}
}
MyClass.myStaticProp = 42;
Daniel Ehrenberg 等人在“静态类特征”和“类字段”提案中添加了这些特征。Google Chrome(和新的 Edge)在版本 72中开始支持这两个提议,相当于Node.js 12+。Firefox 从69 版开始支持公共实例字段,从75版开始支持静态实例字段。Safari 从14.1 版本开始支持两者。在caniuse.com上查看更多信息。
对于尚不支持这些功能的旧浏览器,您可以使用Babel转译类字段。这需要启用@babel/plugin-proposal-class-properties(从v7.14.0开始在 @babel/plugin-env 中默认启用)。
与@kangax 的声明 getter 的解决方案相比,该解决方案还可以提高性能,因为这里直接访问属性而不是通过调用函数。
编辑:统一类字段提案现在处于第 3 阶段。
编辑(2020 年 2 月):静态类功能已拆分为不同的提案。谢谢@GOTO0!
编辑(2021 年 3 月):除了 Safari,2020 年 4 月之后发布的所有主要浏览器现在都支持此功能!
编辑(2021 年 6 月):这两个提案都被ECMAScript 语言委员会TC39接受,Safari 在 14.1 版中发布了这个功能!