結論
古い書き方
/**
* @param {number} x
* @constructor
*/
foo.bar.Hoge = function(x) {
/** @private */
this.x_ = x;
}
/**
* @private {number}
*/
foo.bar.Hoge.prototype.y_;
新しい書き方
/**
* @param {number} x
* @constructor
* @struct
*/
foo.bar.Hoge = function(x) {
/** @private */
this.x_ = x;
/** @private {?number} */
this.y_ = null;
}
気をつけるべき点は2点.
- 全てのプロパティをコンストラクタにまとめる.
- @structをコンストラクタに可能ならばつける.
背景
以前までは,動的に生成されうるプロパティについては,メモリ使用量を減らすため,コンストラクタにはおかれませんでした.Closure libraryにおいては依然型チェックのため,コンストラクタの外に書いていました.これは,型チェックにのみ用いられ,Closure compile後のコードには残りませんでした.
一方で,V8など昨今のJavaScript engineにおいては,より高速なプロパティアクセスのために,lookup tableではなく,hidden classを用いた方法を採用しているため,動的なプロパティの追加はオブジェクトのhidden classのcache missをうみだし,パフォーマンスの低下につながります.つまり, オブジェクトの全てのプロパティをコンストラクタで定義しその後追加を行わない ことが,パフォーマンスの面では効果的と言えます.
これはClosure libraryでは@struct
tagにて保証できます.