單例模式(Singleton),整個運行期間只會被初始化一次。該模式簡單易懂,運用也很廣泛。可以用它來聚合公共的方法,形成一個工具類,對外提供api。
1. 單例模式的基本結構
var Singleton = {
attr1: 'test1',
attr2: 10,
method: function(){
...
},
...
}
這就是一個單例對象,Singleton是全局變量,js載入時被初始化一次。
jquery就是一個很大的單例 (function(){var jquery=(function(){})();window.jQuery = window.$ = jQuery;})(window);
2. 擁有私有變量的單例模式
jascript的對象在運行期間是可以直接修改的,也沒有其他面向對象語言的private等關鍵字。一些方法又不想被外面直接調用或者修改。
2.1 私有方法命名方法 _getName,方法名稱前加下划線,約定此類方法或變量為私有
var Singleton = {
_value: '23s',
_stringSplit: function(str, delimeter){...},
}
2.2 閉包
var Singleton = (function(){
var titileId = "rules";
function closePanel(id){
....
}
return {
publicAttr: 1,
publicMethod: function(){
closePanel(this.publicAttr);
}
}
})();
titleId屬性和closePanle因為在閉包內部,所有成了私有變量,外部不可訪問和修改。
titleId屬性聲明的時候必須加var關鍵字,不然就變成一個全局變量。
3. lazy初始化
由於單例對象一直存在內存之中,如果比較大的實例,一開始就初始化,代價比較高,可以等到需要的時候再初始化
var Singleton = (function(){
var uniqueInstance;
function constructor(){
var privateAttr = "";
function privateMethod(){}
return {}
}
return {
getInstance: function(){
if(!uniqueInstance){
uniqueInstance = new constructor();
}
return uniqueInstance;
}
}
})();
4. 命名空間
一個頁面會載入多個js,全局變量和方法會有沖突或覆蓋的風險。把變量和方法都放到一個單例對象下面,避免沖突。
var MyNamespace = {
}
一個創建命名空間的方法
function createNameSpace(spaceStr){
var space = spaceStr.split(".");
var parent = window, name = "";
for(var i = 0; i < space.length; i++){
name = space[i];
parent = parent[name] = parent[name] || {};
}
}
