惰性實例化要解決的問題是:避免了在頁面中JavaScript初始化執行的時候就實例化類,如果在頁面中沒有使用這個實例化的對象,就會造成一定的內存浪費和性能消耗。如果將一些類的實例化推遲到需要使用它的時候才去做,就可以避免資源過早損耗,做到「按需供應」。
var myNamespace=function{
var Configure=function{
var privateName="someone's name";
var privateReturnName=function{
return privateName;
}
var privateSetName=function(name){
privateName=name;
}
//返回單例對像
return{
setName:function(name){
privateSetName(name);
},
getName:function{
return privateReturnName;
}
}
}
//存儲configure實例
var instance;
return{
getInstance:function{
if(!instance){
instance=Configure;
}
return instance;
}
}
};
//使用方法上需要getInstance這個函數作為中間量
myNamespace.getInstance.getName;
上面就是簡單的惰性實例化的示例,其中有一個缺點就是需要使用中間量來調用內部的Configure函數所返回的對象的方法,當然也可以使用變量來存儲myNamespace.getInstance返回的實例對象。將上面的代碼稍微修改一下,就可以用比較直觀的方法來使用內部的方法和屬性。
//惰性實例化的變體
var myNamespace2=function{
var Configure=function{
var privateName="someone's name";
var privateReturnName=function{
return privateName;
}
var privateSetName=function(name){
privateName=name;
}
//返回單例對像
return{
setName:function(name){
privateSetName(name);
},
getName:function{
return privateReturnName;
}
}
}
//存儲configure實例
var instance;
return{
init:function{
//如果不存在實例,就創建單例實例
if(!instance){
instance=Configure;
}
//創建Configure單例
for(var key in instance){
if(instance.hasOwnProperty(key)){
this[key]=instance[key];
}
}
this.init=null;
return this;
}
}
};
//使用方式
myNamespace2.init;
myNamespace2.getName;
在上面代碼中修改了自執行函數返回的對象的代碼,在獲取Configure函數返回的對象時,將該對象的方法賦給myNamespace2,這樣調用方式就發生了一點改變。