You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ただし、このような動作は、例えばTypeScriptで初期化式を記述せずにフィールドを定義した場合にも同様である。
(TypeScriptで、private number f1; のように定義しても、出力されたJSコードにはなにも出力されない。一方、private number f1 = 1; と書くと、コンストラクタ関数内に「this.f1 = 1;」というコードが追加される。(ただしObject.seal()は行わない。))
ver.1.3.2まで、クラス定義のisDynamicの設定(デフォルト=false)でfalseを指定すると、インスタンスに対してObject.seal()を呼び出し、fieldで定義していないプロパティを(誤って)追加しようとした場合にエラーが発生するようにしていた。
しかし、この仕様を成立させるため、インスタンス生成ごとにfieldで定義されているプロパティをown-propertyとして追加する(instance.prop = value; のようなコードを呼び出す)ことをしており、このため、大量のインスタンスを生成した場合にインスタンス生成コストが高くパフォーマンス劣化が目立ってしまった。
そこで、ver.1.3.3で、isDynamicによる指定は廃止し、Object.seal()を行わないように仕様変更する。
また、これに伴い、インスタンス生成時にプロパティを初期化する処理も実行しないようにする。これによって、例えばフィールドを30個持つクラスのインスタンスを10万個生成した場合のパフォーマンスはIE11で10倍程度(1397ms⇒151ms)高速になる。
なお、クラス定義ではdefaultValueを指定することができるが、この値は、内部で保持しているクラスのプロトタイプオブジェクトに持たせるようにした。これにより、defaultValueについての仕様の互換性を保つ。インスタンス生成後(defaultValueが設定された)プロパティに対して読み取りだけを行っている間は、プロトタイプチェーンをたどって値が取得される。一度でも書き込みを行うと、そのプロパティはインスタンスのown-propertyとなり、以降はそのown-propertyが使われるようになる。
The text was updated successfully, but these errors were encountered: