旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

続・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!(多分)