亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript設計模式之單例模式原理與用法實例分析

2024-05-06 16:45:21
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript設計模式之單例模式原理與用法。分享給大家供大家參考,具體如下:

單例模式的定義:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

單例模式是一種常用的模式,有些對象只需要一個,如線程池、全局緩存、瀏覽器中的window對象等,這時候可以用到單例模式。

單例模式典型的應用場景:單擊按鈕時,頁面中會出現一個登陸浮窗,而該登錄浮窗是唯一的,無論單擊多少次按鈕,這個浮窗都會被創建一次,則適合用單例模式創建。

全局變量不是單例模式,但在JavaScript開發中,經常會把全局變量當成單例來使用。

使用var a = {};這種方式創建對象a時,對象a是獨一無二的,若變量a被聲明在全局作用域下,則可以在代碼的任何位置使用這個變量。這顯然滿足單例模式的兩個條件。

但是全局變量存在很多問題,很容易造成命名空間污染,如上面的var a = {};隨時有可能被覆蓋。

有必要盡量減少全局變量的使用,即使需要,也應該把它的污染降到最低。

降低全局變量帶來的命名污染的幾種方式:

1) 使用命名空間

適當地使用命名空間,并不會杜絕全局變量,但可以減少全局變量的數量。

把a和b都定義為namespace的屬性,這樣可以減少變量和全局作用域打交道的機會:

var namespace = { a: function() {  alert("a"); }, b: function() {  alert("b"); }};

動態地創建命名空間:

var obj = {};obj.namespace = function(name) { var tips = name.split('.'); var cur = obj; for (var i in tips) {  if (!cur[tips[i]])   cur[tips[i]] = {};  cur = cur[tips[i]]; }};obj.namespace('name');obj.namespace('birth.year');console.dir(obj);

上述代碼等價于:

var obj = { name: {}, birth: {  year: {} }};

2) 使用閉包封裝私有變量

var person = (function() { var_name = "Alice"; var _id = 16; return {  getUserInfo: function() {   return _name + ": " + _id;  } }})();

使用下劃線來約定私有變量_name_age,它們被封裝在閉包產生的作用域中,外部是訪問不到這兩個變量的,這就避免了對全局的命令污染。

惰性單例模式:

在需要的時候才創建對象實例。

var createBox = (function() { var div; return function() {  if (!div) {   div = document.createElement('div');   div.innerHTML = '登錄';   div.style.display = 'none';   document.body.appendChild(div);  }  return div; }})();document.getElementById('btn').onclick = function() { var box = createBox(); box.style.display = 'block';};

用變量div來判斷是否已經創建過浮窗。

通用的惰性單例:

問題:上面的惰性單例實例是違反單一職責原則的,創建對象和管理單例的邏輯都放在createBox對象內部。若下次要創建頁面中唯一的iframe,需要把createBox幾乎照抄一遍。

var createIframe = (function() { var iframe; return function() {  if (!iframe) {   iframe = document.createElement('iframe');   document.body.appendChild(iframe);   return iframe;  }  return div; }})();

解決:把不變的部分隔離出來,其實,管理單例的邏輯可以完全抽象出來,因為它們的邏輯是一樣的:用一個變量來標記是否創建過對象,若是,則在下次直接返回已經創建好的對象。

var createSingle = function(func) { var flag; return flag || (flag = func.apply(this, arguments));};var createBox = function() { var div = document.createElement('div'); div.innerHTML = '登錄'; div.style.display = 'none'; document.body.appendChild(div); return div;};document.getElementById('btn').onclick = function() { var box = createBox(); box.style.display = 'block';};var createIframe = createSingle(function() { var iframe = document.createElement('iframe'); document.body.appendChild(iframe); return iframe;});document.getElementById('btn').onclick = function() { var iframe = createIframe(); iframe.style.display = 'block';};

單例模式的其他用途:

單例模式的用途遠不止于創建對象,比如click事件只需要在第一次渲染頁面時綁定一次,顯然運用jQuery的one()方法可以實現。若運用createSingle 方法,也很容易實現:

var createSingle = function(func) { var flag; return flag || (flag = func.apply(this, arguments));};var bindEvent = createSingle(function() { document.getElementById(‘div').onclick = function() {  ... }; return true;});var render = function() { bindEvent();};render();render();render();

render()函數與bindEvent()函數執行了3次,但div實際上只被綁定了一次。

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产91久久久久久| 青青草99啪国产免费| 久久久久久国产精品美女| 国产999精品视频| 亚洲精品久久久久久久久久久久| 亚洲午夜精品久久久久久久久久久久| 日韩精品在线视频| 日韩经典中文字幕| 国产剧情日韩欧美| 国产精品黄色av| 宅男66日本亚洲欧美视频| 69影院欧美专区视频| 北条麻妃一区二区在线观看| 亚洲精品suv精品一区二区| 91久久久久久国产精品| 成人黄在线观看| 亚洲国产精品中文| 亚洲va国产va天堂va久久| 色婷婷av一区二区三区在线观看| 国产91成人在在线播放| 亚洲精品国产欧美| 欧美日韩加勒比精品一区| 一区二区欧美日韩视频| 91精品免费久久久久久久久| 亚洲男人天堂九九视频| 亚洲女人初尝黑人巨大| 美日韩在线视频| 欧美视频免费在线观看| 午夜免费久久久久| 国产精品久久综合av爱欲tv| 日韩av在线精品| 亚洲人成毛片在线播放| 欧美乱大交xxxxx| 欧美丰满少妇xxxxx| 国内精品久久久久久中文字幕| 欧美一区二区视频97| 亚洲天堂男人天堂| 91亚洲午夜在线| 久久国产加勒比精品无码| 97香蕉久久超级碰碰高清版| 亚洲男人天堂视频| 欧美激情在线有限公司| 欧美午夜xxx| 久热精品视频在线| 欧美一区二区三区免费观看| 亚洲欧美国产精品| 日韩av在线导航| 日韩av免费在线观看| 亚洲国产精品999| 久久成人精品电影| 久久99精品久久久久久青青91| 美女福利视频一区| 欧美性色视频在线| 欧美精品亚州精品| 亚洲自拍av在线| 欧美理论片在线观看| 另类天堂视频在线观看| 久久免费观看视频| 国产视频亚洲精品| 日韩av成人在线观看| 日韩精品视频在线| 一个人看的www久久| 亚洲国产女人aaa毛片在线| 亚洲国产精品人人爽夜夜爽| 91国内在线视频| 国产精品伦子伦免费视频| 日韩精品有码在线观看| 国产一区二区三区四区福利| 欧美精品一二区| 欧美日韩一二三四五区| 久久久久久91香蕉国产| 国产视频在线一区二区| 日韩在线精品视频| 人体精品一二三区| 成人免费福利视频| 日韩av电影在线免费播放| 欧美激情高清视频| 亚洲激情视频网站| 91国产美女视频| 国产脚交av在线一区二区| 久久人人看视频| 欧美大全免费观看电视剧大泉洋| 亚洲国产精品中文| 欧美裸体男粗大视频在线观看| 亚洲xxxx妇黄裸体| 欧美激情亚洲另类| 日韩电影免费观看中文字幕| 久久免费福利视频| 亚洲bt天天射| 色噜噜狠狠狠综合曰曰曰| 精品一区二区三区电影| 欧美性xxxx极品hd欧美风情| 国产在线视频一区| 91中文字幕在线| 国产精品青青在线观看爽香蕉| 亚洲综合日韩中文字幕v在线| 国产精品久久久久久av| 一道本无吗dⅴd在线播放一区| 欧美中文字幕精品| 在线播放日韩专区| 国产mv久久久| 国产精品一区二区久久久久| 一区二区三区四区视频| 国产不卡av在线| 国产一区二区三区在线| 久久不射电影网| 亚洲男人天堂视频| 久久久久日韩精品久久久男男| 最近中文字幕mv在线一区二区三区四区| 欧美精品videofree1080p| 亚洲精品一区中文字幕乱码| 亚洲成人av在线播放| 久久综合伊人77777| 国产精品99久久久久久久久久久久| 中文字幕免费精品一区高清| 福利精品视频在线| 蜜月aⅴ免费一区二区三区| 亚洲国产欧美精品| 亚洲欧美在线看| 国产视频亚洲视频| 色婷婷综合久久久久中文字幕1| 日韩精品在线观看视频| 怡红院精品视频| 懂色av一区二区三区| 国产精品免费观看在线| 欧美精品做受xxx性少妇| 国产精品美女av| 国内精品国产三级国产在线专| 久久影院资源站| 中文字幕亚洲一区二区三区| 欧美日韩在线视频一区二区| 欧美日韩国产精品专区| 日韩av在线网站| 亚洲影院色无极综合| 国产成人免费av| 亚洲欧美国产高清va在线播| 菠萝蜜影院一区二区免费| 欧美体内谢she精2性欧美| 国产精品日韩欧美| 精品久久久久久久久国产字幕| 欧美激情小视频| 欧美大成色www永久网站婷| 亚洲精品美女网站| 国产亚洲精品久久| 久久久在线视频| 欧美午夜宅男影院在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲精品视频免费在线观看| 色视频www在线播放国产成人| 成人看片人aa| 日韩有码在线播放| 国产专区精品视频| 一个人www欧美| 亚洲国产另类 国产精品国产免费| 丝袜一区二区三区| 中文字幕综合一区| 国产精品久久久久不卡| 国产91色在线|| 自拍偷拍亚洲欧美| 亚洲国产精品美女| 成人精品视频在线| 亚洲男人的天堂在线播放| 欧美三级欧美成人高清www| 亚洲少妇激情视频|