讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議70:惰性實例化 >

建議70:惰性實例化

惰性實例化要解決的問題是:避免了在頁面中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,這樣調用方式就發生了一點改變。