亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

定義:保證一個(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • location.href語句與火狐不兼容的問題

    location.href語句與火狐不兼容的問題

    在寫JS跳轉(zhuǎn)語句的過程中,發(fā)現(xiàn)這么一個(gè)問題,location.href語句與火狐不兼容的問題
    2010-07-07
  • js復(fù)制網(wǎng)頁內(nèi)容并兼容各主流瀏覽器的代碼

    js復(fù)制網(wǎng)頁內(nèi)容并兼容各主流瀏覽器的代碼

    js 復(fù)制網(wǎng)頁內(nèi)容的方法代碼有很多不過要兼容各瀏覽器就不多了,下面有個(gè)不錯(cuò)的方法,大家可以嘗試操作下
    2013-12-12
  • JavaScript編制留言簿程序代碼

    JavaScript編制留言簿程序代碼

    也許你有一個(gè)很酷的主頁,很希望與人分享。同時(shí),你希望訪問你主頁的人能對(duì)你的主頁提供一些意見和建議,或者你對(duì)某個(gè)主題感興趣,而希望客人也許能給你一幫助,這就要用到留言簿。留言簿使得你能與每一個(gè)訪問你主頁的人交換信息。
    2008-09-09
  • JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別

    JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別

    本文主要介紹了JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法

    javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法

    這篇文章主要介紹了javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • JavaScript的parseInt 取整使用

    JavaScript的parseInt 取整使用

    JavaScript 是弱類型語言, 為了保證數(shù)值的有效性, 在處理數(shù)值的時(shí)候, 我們可以對(duì)數(shù)值字符串進(jìn)行強(qiáng)行轉(zhuǎn)換. 如 parseInt 取整和 parseFloat 取浮點(diǎn)數(shù)
    2011-05-05
  • 跟我學(xué)習(xí)javascript的作用域與作用域鏈

    跟我學(xué)習(xí)javascript的作用域與作用域鏈

    跟我學(xué)習(xí)javascript的作用域與作用域鏈,感興趣的小伙伴們可以參考一下
    2015-11-11
  • JS使用base64格式上傳文件

    JS使用base64格式上傳文件

    這篇文章主要為大家詳細(xì)介紹了JS使用base64格式上傳文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Javascript this 的一些學(xué)習(xí)總結(jié)

    Javascript 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-08
  • js實(shí)現(xiàn)的二級(jí)橫向菜單條實(shí)例

    js實(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

最新評(píng)論