欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

輕松掌握JavaScript單例模式

 更新時間:2016年08月25日 17:01:00   作者:蘇福  
這篇文章主要為大家詳細介紹了JavaScript單例模式,幫助大家輕松掌握JS單例模式,感興趣的小伙伴們可以參考一下

定義:保證一個對象(類)僅有一個實例,并提供一個訪問它的全局訪問點;
實現(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)文章

最新評論