続・javascriptでSingletonパターン
2007年6月20日
【後日追記】
もうちょいマシな書き方になりました → コチラの記事へどうぞ
もうちょいマシな書き方になりました → コチラの記事へどうぞ
この二つのエントリが凄い楽しかった。
自分用はこんな感じにしようかしらん(99.99%パクリ)
/** * インスタンスを生成する * * var foo = Foo.applyNew([param1, param2]); は * var foo = new Foo(param1, param2); と等しい。 */ Function.prototype.applyNew = function(args){ var Scope = function(){}; Scope.prototype = this.prototype; var scope = new Scope(); var instance = this.apply(scope, args || []); return (instance instanceof Object) ? instance : scope; }; /** * Singletonパターンでインスタンスを生成する */Function.prototype.singleton = function(){ var self = arguments.callee; if ("_instance" in self === false) self._instance = this.applyNew(arguments); return self._instance; };Function.prototype.singleton = function(){ if ("__instance__" in this === false) this.__instance__ = this.applyNew(arguments); return this.__instance__; };
テスト
var Foo = function(a, b){ this.a = a; this.b = b; }; var f1 = Foo.singleton(1, "one"); var f2 = Foo.singleton(); f2.a = "two"; f2.b = 2; alert(f1.a); // -> "two" alert(f1.b); // -> 2
OKPK
にしても、これ両方とも約2年前の記事なのか。
世の中は一体どうなってんだ・・・。
世の中は一体どうなってんだ・・・。
あああ、間違ったぁぁぁ!
最初のソースだと、Function.prototype.singletonでひとつのインスタンスしか保持できないので、
複数のクラスでsingletonを使用出来ない!
以下、修正後のソースでテスト
var Foo = function(a){ this.a = a; }; var Bar = function(b){ this.b = b; }; var f = Foo.singleton(1); var b = Bar.singleton(2); alert(f.a); // -> 1 alert(b.b); // -> 2 f.a = 11; b.b = 22; var ff = Foo.singleton(); alert(ff.a); // -> 11 var bb = Bar.singleton(); alert(bb.b); // -> 22
OKPKPKK!(多分)