1. ホーム
  2. ジャバスクリプト

[解決済み】ES6クラス変数の代替品

2022-03-23 14:31:15

質問

現在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;
    }
}

悲しいかな、クラスはメソッドしか含むことができないので、上記はうまくいきません。

ができることは理解しています。 this.myVar = trueconstructor ...しかし、特に大きなクラスで20-30以上のパラメータがある場合、コンストラクタを「ゴミ」にしたくありません。

この問題を処理する方法をいろいろ考えていたのですが、まだ良い方法が見つかっていません。(例えば ClassConfig ハンドラを作成し、そのハンドラに parameter オブジェクトを作成し、それをクラスとは別に宣言します。そして、ハンドラはクラスにアタッチされることになる。私が考えていたのは WeakMaps も、なんとか統合したいところです(笑)。

この状況に対応するために、どのようなアイデアがあるのでしょうか?

解決方法は?

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