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()は行わない。))
Activity
simdy commentedon Dec 4, 2018
なお、この変更により、一度も書き込みしていないフィールドは
instance.hasOwnProperty('fieldName')がfalseになる、という動作になる。
(ver.1.3.2までは、isDynamic=falseなクラスの場合、インスタンス生成時に
プロパティの初期化を行っていたのですべてのフィールドに対してhasOwnProperty()がtrueになっていた)
ただし、このような動作は、例えばTypeScriptで初期化式を記述せずにフィールドを定義した場合にも同様である。
(TypeScriptで、private number f1; のように定義しても、出力されたJSコードにはなにも出力されない。一方、private number f1 = 1; と書くと、コンストラクタ関数内に「this.f1 = 1;」というコードが追加される。(ただしObject.seal()は行わない。))
なお、クラスモジュールを使用した場合でも、コンストラクタの中で(ユーザーコードとして) Object.seal(this); というコードを呼び出せば、今まで通りそのインスタンスの動的なプロパティ追加を禁止することは可能なので、禁止させたい場合はそのように対応していただきたい。
今回の仕様変更は、JSの「型」についての言語的特性、TypeScript等型定義を可能にするJS向け言語の動作、共通的・汎用的に使用されるクラスモジュールの性格などから、パフォーマンスの問題がクラスモジュールの使用を妨げてしまうことの方が問題であると判断したものである。
simdy commentedon Dec 4, 2018
なお、クラス定義にisDynamicの指定がある場合、フレームワークはWARNログを出力する。