現在、ES5 では多くの人がフレームワークで次のパターンを使用してクラスとクラス変数を作成しており、これは便利です。
// ES 5
FrameWork.Class({
variable: 'string',
variable2: true,
init: function(){
},
addItem: function(){
}
});
ES6 ではネイティブにクラスを作成できますが、クラス変数を持つオプションはありません。
// ES6
class MyClass {
const MY_CONST = 'string'; // <-- this is not possible in ES6
constructor(){
this.MY_CONST;
}
}
残念ながら、クラスにはメソッドしか含められないため、上記は機能しません。
できることは理解していますが、特に大きなクラスに 20 ~ 30 以上のパラメータがある場合は、コンストラクターを「ジャンク」this.myVar = true
にconstructor
したくありません。
この問題に対処する方法をいろいろ考えていましたが、まだ良い方法が見つかっていません。(たとえば、ハンドラーを作成しClassConfig
、parameter
クラスとは別に宣言されたオブジェクトを渡します。すると、ハンドラーがクラスにアタッチされます。WeakMaps
何らかの方法で統合することも考えていました。)
この状況に対処するためにどのようなアイデアをお持ちでしょうか?
ベストアンサー1
2018年更新:
現在、ステージ 3 の提案があります。数か月以内にこの回答が時代遅れになることを期待しています。
その間、TypeScript または babel を使用している人は誰でも次の構文を使用できます。
varName = value
クラス宣言/式本体内で変数を定義します。数か月/数週間以内に更新を投稿できると思います。
更新: Chrome 74 ではこの構文が機能するようになりました。
ES6の提案に関するES wikiの注釈(最大限最小限のクラス) 注記:
プロトタイプデータプロパティ(メソッド以外)、クラスプロパティ、インスタンスプロパティを直接宣言的に定義する方法は(意図的に)ありません。
クラス プロパティとプロトタイプ データ プロパティは宣言の外部で作成する必要があります。
クラス定義で指定されたプロパティには、オブジェクトリテラルに出現した場合と同じ属性が割り当てられます。
これは、あなたが求めているものが検討され、明確に反対されたことを意味します。
しかし、なぜ?
いい質問ですね。TC39 の優秀なメンバーは、クラス宣言でクラスの機能を宣言および定義することを望んでいます。メンバーではありません。ES6 クラス宣言は、ユーザーに対するコントラクトを定義します。
クラス定義はプロトタイプメソッドを定義することに注意してください。プロトタイプで変数を定義することは通常行いません。もちろん、次のものを使用できます。
constructor(){
this.foo = bar
}
あなたが提案したようにコンストラクタで。また、合意の要約。
ES7以降
ES7の新しい提案では、クラス宣言と式を通じてより簡潔なインスタンス変数を使用できるようになる予定です。https://esdiscuss.org/topic/es7-property-initializers