2010-10-10 46 views
6

我目前知道在JavaScript中構建單例的兩種方法。第一個:如何使用構造函數創建JavaScript單例式而不使用return?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

它是完美的,除了它沒有可以運行初始化代碼的構造函數。

二:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

第一個版本沒有私人性質也不會有一個構造函數,但它是更快,更簡單。第二個版本更復雜,更難看,但有一個構造函數和私有屬性。

我不需要私人財產,我只是想要一個構造函數。有沒有我缺少的東西,或者是我得到的唯一的兩種方法?

+1

第二種方法不是「醜陋」;這是語言的一個自然部分。能夠用函數創建函數是Javascript最強大的功能之一。 – Pointy 2010-10-10 12:00:29

回答

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

我認爲這個解決方案並不清楚,因爲使用這個構造函數是下一個:'new Singleton()'。這意味着開發人員希望每次他/她編寫此代碼時都會獲得一個新實例。即'new Singleton()== new Singleton()'返回'true',但必須返回'false'。 – pto3 2017-05-15 07:54:11

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

這基本上是一樣創建一個函數,然後立即assiging它的一個新的instace到變量單。像var singleton = new SingletonObject();

我反對使用單身這種方式在javscript的執行次序,但因爲高度的建議是基於在該文件中放置的對象,而不是你自己的邏輯。

1

這是怎麼回事?

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

這裏是我的解決方案與封閉:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

測試:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

如果你只是尋找初始化你單身的地方,這個怎麼樣?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

簡單而優雅。

相關問題