輕松掌握JavaScript單例模式
定義:保證一個對象(類)僅有一個實例,并提供一個訪問它的全局訪問點;
實現(xiàn)原理:利用閉包來保持對一個局部變量的引用,這個變量保存著首次創(chuàng)建的唯一的實例;
主要用于:全局緩存、登錄浮窗等只需要唯一一個實例的時候;
一. 為一個非單例模式對象(如:Demo)實現(xiàn)單例模式的方法:
給Demo添加一個靜態(tài)方法來實現(xiàn)單例:
Demo.getSingle = (function(){
var demo = null;
return function(name){
if(!demo){
demo = new Demo(name);
}
return demo;
}
})();
用法:
非單例模式:var a = new Demo('Peter');
單例模式:
var b1 = Demo.getSingle('Peter');
var b2 = Demo.getSingle('Sufei');
b1 === b2;//true,都引用的是new Demo('Peter')
通過代理類來實現(xiàn)單例:
var ProxyDemo = (function(){
var demo = null;
return function(name){
if(!demo){
demo = new Demo(name);
}
return demo;
}
})();
用法:
非單例模式:var a = new Demo('Peter');
單例模式:var b = new ProxyDemo('Peter');
二. 惰性單例模式:只在需要的時候才創(chuàng)建該單例;
以下是通用惰性單例的創(chuàng)建方法:
var getSingle = function(foo){
var single = null;
return function(){
return single || (single = foo.apply(this,arguments));
}
};
用法:
var createLoginLayer = function(){
var frag = document.createDocumentFragment();
var div = document.createElement('div');
div.style.display = 'none';
//以下給div添加其它登錄元素
...
document.body.appendChild(frag.appendChild(div));
return div;
}
var createSingleLoginLayer = getSingle(createLoginLayer);
//當(dāng)用戶第一次點擊按鈕(id = 'lgBtn')時,來創(chuàng)建并顯示登錄窗口,之后重復(fù)點擊按鈕不會重復(fù)創(chuàng)建;
document.getElementById('lgBtn').onclick = function(){
var lg = createSingleLoginLayer();
lg.style.display = 'block';
}
附:緩存函數(shù)的計算結(jié)果,如計算一個數(shù)的數(shù)列
以下是不緩存的寫法,非常慢!
function foo(n){
results = n < 2 ? n : foo(n - 1) + foo(n - 2);
return results;
}
console.log(foo(40));//得計算好幾秒
以下是緩存寫法,基本瞬間出結(jié)果!
var cache = {};
function foo(n){
if(!cache[n]){
cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2);
}
return cache[n];
}
console.log(foo(100));
更好的寫法:
var foo = (function(){
var cache = {};
return function(n){
if(!cache[n]){
cache[n] = n < 2 ? n : foo(n - 1) + foo(n - 2);
}
return cache[n];
};
})();
console.log(foo(100));
參考文獻:
《JavaScript模式》
《JavaScript設(shè)計模式與開發(fā)實踐》
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS字符串和數(shù)組如何實現(xiàn)相互轉(zhuǎn)化
這篇文章主要介紹了JS字符串和數(shù)組如何實現(xiàn)相互轉(zhuǎn)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
極力推薦一款小巧玲瓏的可視化編輯器bootstrap-wysiwyg
這篇文章主要為大家極力推薦一款小巧玲瓏的可視化編輯器bootstrap-wysiwyg,是一款基于jquery和bootstrap的可視化編輯器,感興趣的小伙伴們可以參考一下2016-05-05
基于bootstrap實現(xiàn)bootstrap中文網(wǎng)巨幕效果
這篇文章主要介紹了基于bootstrap實現(xiàn)bootstrap中文網(wǎng)巨幕效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
IE6中使用position導(dǎo)致頁面變形的解決方案(js代碼)
IE6中使用position導(dǎo)致頁面變形,影響用戶體驗,通過搜索可以通過js來實現(xiàn)。2011-01-01
利用javascript移動div層-javascript 拖動層
利用javascript開發(fā)在界面上隨意拖動以下html code中的div層2009-03-03

