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以上のメンバー宣言に関するものであるため、ここでの回答で説明する必要があります。
ES6は、クラス変数を定義するための構文をほぼ確実にカバーしません。クラス構文を使用して定義できるのは、メソッドとゲッター/セッターのみです。これは、MyClass.classVariable = 42;
クラス変数のルート。
いくつかのデフォルトでクラスを初期化するだけの場合は、関数の引数とデフォルトを破壊するための豊富な新しい構文セットが使用できます。簡単な例を挙げます:
class Foo {
constructor(foo = 123) {
this.foo = foo;
}
}
new Foo().foo == 123
new Foo(42).foo == 42
Google Closure Compilerを使用したことはありませんが、Babelでは、 here のようにstatic
(class
にスコープされた)変数を宣言できます。この記事は、Reactのstatic
メンバーの有用性のためにReactに焦点を当てていますが、一般的にES6 class
esに適用できます。
構文は、提案された構文に近いです。
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static defaultArg = 42;
let arg = MyClass.defaultArg;
}
これをコンパイルするには、'es7.classProperties'
を.babelrc
に追加する必要があることに注意してください。詳細については、 Babel 5.0.0リリースノート を参照してください。
static
をconst
として宣言する方法があるかどうかわかりません。
ES6仕様の一部ではありませんが、これは間もなく登場するようで、Babelや他の一部によって既にサポートされています。
仕様は次のとおりです。 https://github.com/jeffmo/es-class-fields-and-static-properties
すべての提案とそのステータスの完全なリスト: https://github.com/tc39/ecma262