function Sample() {
// キャッシュされたインスタンス
var instance = this;
// プロパティの定義
this.hoge = 0;
this.fuga = "test";
// コンストラクタの書き換え
Sample = function() {
return instance;
};
}
元々のコンストラクタは初回のみ呼び出され、通常通りthisを返します。
2回目以降は書き換えられたコンストラクタが実行されます。
ただし、この実装では最初の定義から再定義の間にプロパティを追加すると、書き換えられたコンストラクタで追加したプロパティが失われます。
それを解決するのが以下の方法。
function Sample() {
// キャッシュされたインスタンス
var instance;
// コンストラクタを書き換える
Sample = function Sample() {
return instance;
};
// プロトタイププロパティを引き継ぐ
Sample.prototype = this;
// インスタンス
instance = new Sample();
// コンストラクタのポインタを再設定
instance.constructor = Sample;
// プロパティの定義
instance.hoge = 0;
instance.fuga = "test";
return instance;
}
これでよし。
最終更新:2011年11月15日 00:24