單例模式是javascript最基本,最有用的模式之一,它提供了一種將代碼組織爲一個邏輯單元的手段,這個邏輯單元中的代碼經過單一的變量進行訪問。個人理解是在這個做用域中,只有經過單一的變量來訪問,不存在第二份。這樣的話,也能用來劃分命名空間,以減小全局變量的泛濫。javascript
一、對象直接量實現最基本、最簡單的單體java
var Singleton = { attr1 : 1, attr2 : 'hello', method1 : function(){alert(this.attr2);}, method2 : function(arg){} }
這種方式中,對象全部成員都經過Singleton加點號來訪問,全部成員都是公開的,沒有私有的,在執行到變量Singleton時,會加載自身,即非惰性加載。閉包
二、閉包實現私有成員的單體this
var Singleton = function(){ var attr = 1, fn = function(){}; return { method : function(){ fn(); }, getAttr : function(){ return attr; } }; }();
這種方式中var定義私有的成員屬性attr,方法fn,而後返回公開的接口method和getAttr,從此修改實現時,接口方法就不用改變了,只須要修改私有的attr和fn的具體實現,這樣的話,只須要改一份,其餘地方都不須要改了。spa
三、閉包實現私有成員的惰性實例化單體對象
var Singleton = (function () {
var instantiated;
function init() {
/*這裏定義單例代碼*/
return {
publicMethod: function () {
console.log('hello world');
},
publicProperty: 'test'
};
}
return {
getInstance: function () {
if (!instantiated) {
instantiated = init();
}
return instantiated;
}
};
})();
/*調用公有的方法來獲取實例:*/Singleton.getInstance().publicMethod();