从 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 等人在“静态类特征”和“类字段”提案中添加的。谷歌浏览器(和新的 Edge)在版本 72 中开始支持这两个提案,相当于Node.js 12+。Firefox 自版本 69起支持公共实例字段,自版本 75起支持静态实例字段。Safari 从14.1 版开始支持两者。在caniuse.com 上查看更多信息。
对于尚不支持这些功能的旧浏览器,您可以使用Babel来转译类字段。这需要启用@babel/plugin-proposal-class-properties(默认情况下在 @babel/plugin-env 从v7.14.0开始启用)。
与@kangax 声明getter 的解决方案相比,该解决方案的性能也更高,因为这里的属性是直接访问的,而不是通过调用函数来访问的。
编辑:统一的类字段提案现在处于第 3 阶段。
编辑(2020 年 2 月):静态类功能已拆分为不同的提案。谢谢@GOTO0!
编辑(2021 年 3 月):除 Safari 外,2020 年 4 月之后发布的所有主要浏览器现在都支持此功能!
编辑(2021 年 6 月):两个提案都被TC39接受,ECMAScript 语言委员会和 Safari 在 14.1 版中发布了此功能!