Singleton : JavaScript

数ある中から下のページを参考にしました。一番スマートと思います。ちょっとGood Partsっぽくアレンジ。Wikiはシングルトンの説明に。

KAI.JAEGER : The singleton design pattern in JavaScript
Singleton パターン - Wikipedia

var Singleton = function () {

    var instance = null;
   
    var Constructor = function () {  // コンストラクタ。プライベート関数
        var that = {};  // ここにパブリックメソッドを収納
        var id = Math.random();  // IDを乱数にする
        that.getId = function () {
            return id;
        };
        return that;
    };
   
    return new function () {  // staticなメソッド
        this.getInstance = function () {
            if (instance === null) {  // ヌルならコンストラクタを代入
                instance = Constructor();
                instance.constructor = null;  // たぶんnewを禁止している?
            }
            return instance;
        };
    };
}(); // 最後の丸カッコをわすれずに!

var i1 = Singleton.getInstance();
var i2 = Singleton.getInstance();
alert(i1.getId() + "\n" + i2.getId()); // おなじ乱数になる

黒字がいわゆる「The Good Parts」的な部分で、それを赤字の部分でラップすればシングルトンが実装できる。

後半の "return new function ()〜" と一番最後の丸カッコ "()" のコンビネーションでstaticなメソッドを実現している模様。"instance.constructor = null;"  はnewを禁止しているのか? この行があってもなくても挙動が変わらないようなんだけど……よくわからない。

Rubyのようにincludeしただけでシングルトンを実装できるような仕組みをつくれればいいんだが、自分にはひらめけない。上記のサイトではシングルトン化する関数を試みているが、グローバル変数をつかっているからなぁ……。

でもこれだけでも充分スマートだし満足してるぅ。ヽ(´▽`)/〜♪

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン
売り上げランキング: 5275

0 件のコメント:

コメントを投稿