web-dev-qa-db-ja.com

ES6クラスのメンバー変数

ECMAScript6 class表記を使用して、静的クラス変数またはインスタンス変数のデフォルト値を宣言する方法はありますか? classがなければ、私が考えていることは

function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";

私の意見で最も明白なES6のような表記は

class MyClass {
    constructor(arg) { if(arg) this.arg = arg; }
    static let classVariable = 42;
    let arg = "no arg specified";
}

現在の仕様ドラフト によると、ClassElementのプロダクションは静的およびインスタンスメソッドであり、すべてセミコロン。 OK、ゲッターメソッドとセッターメソッドのペアを使用して、私が説明したものと同様のセマンティクスを実現できますが、パフォーマンスが大幅に低下し、本当に奇妙な構文であると思います。

何らかの方法で変数をclass表記に含めることを提案するドラフトはありますか?もしそうなら、提案された構文は何ですか、どこで公開されましたか、どこで議論されましたか、議論はどのように進みましたか、そしてその面の現状はどうですか?現状では、どのレベルでも以前にそのようなことが議論されていない場合、この質問に答えることはできませんが、私はそうは思わないと思います。


ちょっとした背景:現在、ES6を入力として使用して、高度なコンパイルを実行するGoogleクロージャーコンパイラをいじっています。それが機能するためには、メンバー変数に型注釈を配置する場所が必要で、ECMAScriptのセマンティックno-opであるがクロージャーコンパイラに型情報を提供する/** @type {string} */ MyClass.prototype.arg;のような構文を使用して配置していました素敵で簡単。 classコンストラクトを使用してこれを行う同様の素敵な方法をまだ見つけていません。しかし、この側面に対処したい場合、それはコメントになります。上記の質問は、no-ops以上のメンバー宣言に関するものであるため、ここでの回答で説明する必要があります。

29
MvG

ES6は、クラス変数を定義するための構文をほぼ確実にカバーしません。クラス構文を使用して定義できるのは、メソッドとゲッター/セッターのみです。これは、MyClass.classVariable = 42;クラス変数のルート。

いくつかのデフォルトでクラスを初期化するだけの場合は、関数の引数とデフォルトを破壊するための豊富な新しい構文セットが使用できます。簡単な例を挙げます:

class Foo {
    constructor(foo = 123) {
        this.foo = foo;
    }
}

new Foo().foo == 123
new Foo(42).foo == 42
41
lyschoening

Google Closure Compilerを使用したことはありませんが、Babelでは、 here のようにstaticclassにスコープされた)変数を宣言できます。この記事は、Reactのstaticメンバーの有用性のためにReactに焦点を当てていますが、一般的にES6 classesに適用できます。

構文は、提案された構文に近いです。

class MyClass {
    constructor(arg) { if(arg) this.arg = arg; }
    static defaultArg = 42;
    let arg = MyClass.defaultArg;
}

これをコンパイルするには、'es7.classProperties'.babelrcに追加する必要があることに注意してください。詳細については、 Babel 5.0.0リリースノート を参照してください。

staticconstとして宣言する方法があるかどうかわかりません。

7
ericsoco

ES6仕様の一部ではありませんが、これは間もなく登場するようで、Babelや他の一部によって既にサポートされています。

仕様は次のとおりです。 https://github.com/jeffmo/es-class-fields-and-static-properties

すべての提案とそのステータスの完全なリスト: https://github.com/tc39/ecma262

3
Clayton Gulick