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) は、 Node.js 12+と同等のバージョン 72で両方の提案のサポートを開始しました。Firefox は、バージョン 69以降のパブリック インスタンス フィールドとバージョン 75以降の静的インスタンス フィールドをサポートしています。Safari は、バージョン 14.1以降、両方をサポートしています。詳しくはcaniuse.comをご覧ください。
これらの機能をまだサポートしていない古いブラウザーの場合、Babelを使用してクラス フィールドをトランスパイルできます。これには、@babel/plugin-proposal-class-propertiesを有効にする必要があります ( v7.14.0 以降の @babel/plugin-env ではデフォルトで有効になっています)。
ゲッターを宣言する @kangax のソリューションと比較すると、このソリューションは、関数を呼び出す代わりにプロパティに直接アクセスするため、よりパフォーマンスが高くなる可能性があります。
編集: 統一されたクラス フィールドの提案は、現在ステージ 3 にあります。
編集 (2020 年 2 月) : 静的クラス機能は別の提案に分割されました。ありがとう@GOTO0!
編集 (2021 年 3 月) : Safari を除いて、2020 年 4 月以降にリリースされたすべての主要なブラウザーがこの機能をサポートするようになりました!
編集 (2021 年 6 月) : 両方の提案がECMAScript 言語委員会であるTC39によって受け入れられ、Safari はバージョン 14.1 でこの機能を出荷しました!