輕松掌握J(rèn)avaScript單例模式

字號(hào):


    這篇文章主要為大家詳細(xì)介紹了JavaScript單例模式,幫助大家輕松掌握J(rèn)S單例模式,感興趣的小伙伴們可以參考一下
    定義:保證一個(gè)對(duì)象(類)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn);
    實(shí)現(xiàn)原理:利用閉包來(lái)保持對(duì)一個(gè)局部變量的引用,這個(gè)變量保存著首次創(chuàng)建的唯一的實(shí)例; 
    主要用于:全局緩存、登錄浮窗等只需要唯一一個(gè)實(shí)例的時(shí)候; 
    一. 為一個(gè)非單例模式對(duì)象(如:Demo)實(shí)現(xiàn)單例模式的方法:
    給Demo添加一個(gè)靜態(tài)方法來(lá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') 
    通過(guò)代理類來(lái)實(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í),來(lái)創(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í)踐》
    以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助