この問題を解決することを目的とした、DanielEhrenbergとJeffMorrisonによる「StaticClassFeatures」と呼ばれるステージ3ECMAScriptの提案があります。ステージ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のソリューションと比較すると、このソリューションは、関数を呼び出す代わりにプロパティに直接アクセスされるため、パフォーマンスも向上します。
この提案が受け入れられれば、JavaやC♯などの従来のオブジェクト指向言語に似た方法でJavaScriptコードを記述できるようになります。
編集:統一されたクラスフィールドの提案は現在ステージ3にあります。Babelv7.xパッケージに更新します。
編集(2020年2月):静的クラス機能は別の提案に分割されました。ありがとう@ GOTO0!