2012-11-05 60 views
4

我有一些關於在javascript中創建單例的方法 - 如果我們想使用私有變量,則使用簡單的對象字面值方法和另一種使用閉包方法。JavaScript實用函數將一個類 - 「構造函數」轉換爲Singleton

我期待建立一個實用的功能,例如

Singleton(classname);

不管類 - 「構造函數」我通過在這裏作爲參數辛格爾頓方法這個類轉換成一個Singleton對象,PLUS在調用new Classname()之後,如果有人再次激發新類名()他/她得到一些new Error ("Already instantiated once, this is Singleton");

用例如下 -

function Circle() {this.name = "Circle";} 
SingleTon(Circle); 
var circle1 = new Circle(); // returns the circle instance 
var circle2 = new Circle(); // throws Error "Already instantiated once, this is Singleton" 

我只是試圖在這裏定義「Singleton」方法。

我所看到的,在使用得到像實例的getInstance方法類似的例子 - Singleton.getInstance(圓)等等,但我找上面的特定問題,其中另一個程序員習慣在創建一個實例「新」方式嘗試在代碼中第二次激發new Circle();並收到錯誤。

以這種方式創建一個單例是一個問題,但主要問題是拋出「錯誤」,以便我瞭解Circle構造函數需要在Singleton函數中的某處進行修改,但不確定如何完成此操作。

有沒有解決方法?

在此先感謝!

回答

3
function Singleton(param){ 
    var count = 0, old = window[param]; 
    window[param] = function(){ 
     if(++count <= 1) return old; 
     else alert('NO WAY!'); 
    } 
} 

你會稱其爲:

Singleton('Circle'); 

演示:http://jsfiddle.net/maniator/7ZFmE/

記住這僅僅在進行Circle或任何其他功能類在全球window命名空間。任何其他名稱空間中的任何東西都需要更多的操作才能使其完全工作。

+0

快如閃電,我能看到的第一個代碼段來秒鐘內我張貼了這個問題之後,然後你不斷增加的呼叫和把它大約2分鐘的的jsfiddle。精確度如此之快,令人難以置信。它涵蓋了所有要求,如:我無法更改已寫好的圓函數,並且圓函數應該獨立於單例函數,Singleton函數會修改圓函數。該解決方案可以輕鬆應用於任何預先編寫的代碼。我在等待其他人回答這個問題,但真的沒有希望得到更好的答案。 –

+1

真正的天才答案在幾秒鐘內:)非常感謝 –

+0

@AnmolSaraf沒問題^ _ ^高興地幫忙! – Neal

0

試試這個:現在

Circle = function() { 
    if (!(this instanceof Circle)) { 
    // called as function 
    return Circle.singleton || (Circle.singleton = new Circle()); 
    } 
    // called as constructor 

    this.name = "the circle"; 
}; 

,沒有新的運營商,你的單身或使用

var mycircle = Circle(); 

當心我使用的是一個全球性的名稱爲例如一個新的,你可能也做

var Circle = window.Circle = function() { //... 
0

你當然也可以創建一個單一的實例對象的可能性與s使用閉包omething像:

var singlecircle = (new function(name) { 
     this.name = name || "Default circle";}('squared') 
    ); 
singlecircle.name; //=> 'squared' 
相關問題