輕松掌握J(rèn)avaScript單例模式
定義:保證一個(gè)對(duì)象(類)僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn);
實(shí)現(xiàn)原理:利用閉包來保持對(duì)一個(gè)局部變量的引用,這個(gè)變量保存著首次創(chuàng)建的唯一的實(shí)例;
主要用于:全局緩存、登錄浮窗等只需要唯一一個(gè)實(shí)例的時(shí)候;
一. 為一個(gè)非單例模式對(duì)象(如:Demo)實(shí)現(xiàn)單例模式的方法:
給Demo添加一個(gè)靜態(tài)方法來實(shí)現(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')
通過代理類來實(shí)現(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');
二. 惰性單例模式:只在需要的時(shí)候才創(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)用戶第一次點(diǎn)擊按鈕(id = 'lgBtn')時(shí),來創(chuàng)建并顯示登錄窗口,之后重復(fù)點(diǎn)擊按鈕不會(huì)重復(fù)創(chuàng)建; document.getElementById('lgBtn').onclick = function(){ var lg = createSingleLoginLayer(); lg.style.display = 'block'; }
附:緩存函數(shù)的計(jì)算結(jié)果,如計(jì)算一個(gè)數(shù)的數(shù)列
以下是不緩存的寫法,非常慢!
function foo(n){ results = n < 2 ? n : foo(n - 1) + foo(n - 2); return results; } console.log(foo(40));//得計(jì)算好幾秒
以下是緩存寫法,基本瞬間出結(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));
參考文獻(xiàn):
《JavaScript模式》
《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js單例模式的兩種方案
- JS實(shí)現(xiàn)單例模式的6種方案匯總
- javascript 單例模式演示代碼 javascript面向?qū)ο缶幊?/a>
- JavaScript的單例模式 (singleton in Javascript)
- [js高手之路]單例模式實(shí)現(xiàn)模態(tài)框的示例
- JavaScript設(shè)計(jì)模式之策略模式詳解
- javascript設(shè)計(jì)模式--策略模式之輸入驗(yàn)證
- JavaScript設(shè)計(jì)模式之策略模式實(shí)例
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之策略模式
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式(策略模式)
- javascript單例模式與策略模式實(shí)例詳解
相關(guān)文章
js復(fù)制網(wǎng)頁內(nèi)容并兼容各主流瀏覽器的代碼
js 復(fù)制網(wǎng)頁內(nèi)容的方法代碼有很多不過要兼容各瀏覽器就不多了,下面有個(gè)不錯(cuò)的方法,大家可以嘗試操作下2013-12-12JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別
本文主要介紹了JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法
這篇文章主要介紹了javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12跟我學(xué)習(xí)javascript的作用域與作用域鏈
跟我學(xué)習(xí)javascript的作用域與作用域鏈,感興趣的小伙伴們可以參考一下2015-11-11Javascript this 的一些學(xué)習(xí)總結(jié)
相信有C++、C#或Java等編程經(jīng)驗(yàn)的各位,對(duì)于this關(guān)鍵字再熟悉不過了。由于Javascript是一種面向?qū)ο蟮木幊陶Z言,它和C++、C#或Java一樣都包含this關(guān)鍵字,接下來我們將向大家介紹Javascript中的this關(guān)鍵字2012-08-08js實(shí)現(xiàn)的二級(jí)橫向菜單條實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)的二級(jí)橫向菜單條,是非常美觀簡潔的二級(jí)導(dǎo)航條效果,可實(shí)現(xiàn)針對(duì)鼠標(biāo)事件的動(dòng)態(tài)響應(yīng)及頁面樣式切換功能,簡單實(shí)用,需要的朋友可以參考下2015-08-08