国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

輕松掌握JavaScript單例模式

2019-11-20 09:09:07
字體:
來源:轉載
供稿:網友

定義:保證一個對象(類)僅有一個實例,并提供一個訪問它的全局訪問點;
實現原理:利用閉包來保持對一個局部變量的引用,這個變量保存著首次創建的唯一的實例; 
主要用于:全局緩存、登錄浮窗等只需要唯一一個實例的時候; 

一. 為一個非單例模式對象(如:Demo)實現單例模式的方法:
 給Demo添加一個靜態方法來實現單例:

 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') 

通過代理類來實現單例:

 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'); 

二. 惰性單例模式:只在需要的時候才創建該單例; 
以下是通用惰性單例的創建方法:

 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);//當用戶第一次點擊按鈕(id = 'lgBtn')時,來創建并顯示登錄窗口,之后重復點擊按鈕不會重復創建;document.getElementById('lgBtn').onclick = function(){  var lg = createSingleLoginLayer();  lg.style.display = 'block';} 

附:緩存函數的計算結果,如計算一個數的數列 
以下是不緩存的寫法,非常慢!

 function foo(n){  results = n < 2 ? n : foo(n - 1) + foo(n - 2);  return results;}console.log(foo(40));//得計算好幾秒 

以下是緩存寫法,基本瞬間出結果!

 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設計模式與開發實踐》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱西市| 宣城市| 张家界市| 通榆县| 乌兰浩特市| 香格里拉县| 略阳县| 松滋市| 琼结县| 逊克县| 日喀则市| 崇礼县| 石狮市| 泗水县| 衡南县| 驻马店市| 普宁市| 漯河市| 平定县| 从江县| 南岸区| 芜湖县| 延庆县| 鹤壁市| 咸阳市| 香格里拉县| 南丰县| 湄潭县| 察雅县| 信宜市| 龙门县| 墨脱县| 平果县| 潜江市| 开鲁县| 天峻县| 湟中县| 伊宁市| 科技| 荃湾区| 明水县|