最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

學(xué)習(xí)JavaScript設(shè)計模式(代理模式)

 更新時間:2015年12月03日 09:38:43   投稿:lijiao  
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計模式,其中重點介紹代理模式,對代理模式進行詳細剖析,感興趣的小伙伴們可以參考一下

代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問
代理模式的用處(個人理解):為了保障當前對象的單一職責(zé)(相對獨立性),而需要創(chuàng)建另一個對象來處理調(diào)用當前對象之前的一些邏輯以提高代碼的效率、狀態(tài)判斷等。
代理模式中最常用的是虛擬代理緩存代理

一、虛擬代理
虛擬代理是把一些開銷很大的對象,延遲到真正需要它的時候才去創(chuàng)建執(zhí)行
示例: 虛擬代理實現(xiàn)圖片預(yù)加載

// 圖片加載函數(shù)
var myImage = (function(){
  var imgNode = document.createElement("img");
  document.body.appendChild(imgNode);

  return {
    setSrc: function(src) {
      imgNode.src = src;
    }
  }
})();

// 引入代理對象
var proxyImage = (function(){
  var img = new Image;
  img.onload = function(){
    // 圖片加載完成,正式加載圖片
    myImage.setSrc( this.src );
  };
  return {
    setSrc: function(src){
      // 圖片未被載入時,加載一張?zhí)崾緢D片
      myImage.setSrc("file://c:/loading.png");
      img.src = src;
    }
  }
})();

// 調(diào)用代理對象加載圖片
proxyImage.setSrc( "http://images/qq.jpg");

示例: 虛擬代理合并HTTP請求
假設(shè)一個功能需要頻繁的進行網(wǎng)絡(luò)請求,這會造成相當大的開銷,解決方案是通過一個代理函數(shù)來收集一段時間之內(nèi)的請求,一次性發(fā)給服務(wù)器。
例如:做一個文件同步的功能,當我們選中一個文件時,就同步到另外一臺備用服務(wù)器上

// 文件同步函數(shù)
var synchronousFile = function( id ){
  console.log( "開始同步文件,id為:" + id );
}
// 使用代理合并請求
var proxySynchronousFile = (function(){
  var cache = [], // 保存一段時間內(nèi)需要同步的ID
    timer; // 定時器指針

  return function( id ){
    cache[cache.length] = id;
    if( timer ){
      return;
    }

    timer = setTimeout( function(){
      proxySynchronousFile( cache.join( "," ) ); // 2s 后向本體發(fā)送需要同步的ID集合
      clearTimeout( timer ); // 清空定時器
      timer = null;
      cache = []; // 晴空定時器
    },2000 );
  }
})();

// 綁定點擊事件
var checkbox = document.getElementsByTagName( "input" );

for(var i= 0, c; c = checkbox[i++]; ){
  c.onclick = function(){
    if( this.checked === true ){
      // 使用代理進行文件同步
      proxySynchronousFile( this.id );
    }
  }
}

二、 緩存代理
緩存代理可以為一些開銷大的運算結(jié)果提供暫時的存儲,在下次運算時,如果傳遞進來的參數(shù)跟之前一致,則可以返回前面的運算結(jié)果。
示例: 為乘法、加法等創(chuàng)建緩存代理

// 計算乘積
var mult = function(){
  var a = 1;
  for( var i = 0, l = arguments.length; i < l; i++){
    a = a * arguments[i];
  }
  return a;
};
// 計算加和
var plus = function () {
 var a = 0;
  for( var i = 0, l = arguments.length; i < l; i++ ){
    a += arguments[i];
  }
  return a;
};
// 創(chuàng)建緩存代理的工廠
var createProxyFactory = function( fn ){
  var cache = {}; // 緩存 - 存放參數(shù)和計算后的值
  return function(){
    var args = Array.prototype.join.call(arguments, "-");
    if( args in cache ){ // 判斷出入的參數(shù)是否被計算過
      console.log( "使用緩存代理" );
      return cache[args];
    }
    return cache[args] = fn.apply( this, arguments );
  }
};
// 創(chuàng)建代理
var proxyMult = createProxyFactory( mult ),
  proxyPlus = createProxyFactory( plus );

console.log( proxyMult( 1, 2, 3, 4 ) ); // 輸出: 24
console.log( proxyMult( 1, 2, 3, 4 ) ); // 輸出: 緩存代理 24
console.log( proxyPlus( 1, 2, 3, 4 ) ); // 輸出: 10
console.log( proxyPlus( 1, 2, 3, 4 ) ); // 輸出: 緩存代理 10

以上三個示例為大家詳細介紹了javascript代理模式,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 詳解JavaScript狀態(tài)容器Redux

    詳解JavaScript狀態(tài)容器Redux

    Redux官網(wǎng)上是這樣描述Redux,Redux is a predictable state container for JavaScript apps.(Redux是JavaScript狀態(tài)容器,提供可預(yù)測性的狀態(tài)管理)。目前Redux GitHub有5w多star,足以說明 Redux 受歡迎的程度
    2021-06-06
  • 淺談利用JavaScript進行的DDoS攻擊原理與防御

    淺談利用JavaScript進行的DDoS攻擊原理與防御

    這篇文章主要介紹了淺談利用JavaScript進行的DDoS攻擊原理與防御,以及介紹了相關(guān)的中間人攻擊原理,需要的朋友可以參考下
    2015-06-06
  • JS Canvas接口和動畫效果大全

    JS Canvas接口和動畫效果大全

    這篇文章主要介紹了JS Canvas接口和動畫效果大全,對Canvas感興趣的同學(xué),可以參考下
    2021-04-04
  • three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例

    three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例

    最近在用three.js做三維模型的時候,需要通過鼠標滑輪向前來控制視角朝鼠標的位置放大,然后通過鼠標滑輪向后將視角復(fù)原,這篇文章主要給大家介紹了關(guān)于three.js如何設(shè)置物體的縮放和旋轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 讓回調(diào)函數(shù) showResponse 也帶上參數(shù)的代碼

    讓回調(diào)函數(shù) showResponse 也帶上參數(shù)的代碼

    讓回調(diào)函數(shù) showResponse 也帶上參數(shù)的代碼...
    2007-08-08
  • 教你如何寫出可維護的JS代碼

    教你如何寫出可維護的JS代碼

    在平時工作開發(fā)中,大部分開發(fā)人員都花費大量的時間在維護其他人員的代碼。很難從頭開始開發(fā)新代碼,很多情況下都是以他人成果為基礎(chǔ)的,或者新增修改需求,自己寫的代碼也會被其他開發(fā)人員調(diào)用,所以寫好一份高質(zhì)量可維護的代碼就顯得十分重要。
    2021-05-05
  • JS過濾url參數(shù)特殊字符的實現(xiàn)方法

    JS過濾url參數(shù)特殊字符的實現(xiàn)方法

    本篇文章主要是對JS過濾url參數(shù)特殊字符的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 詳解如何準確判斷JavaScript中的數(shù)據(jù)類型

    詳解如何準確判斷JavaScript中的數(shù)據(jù)類型

    JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù),本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法,需要的朋友可以參考下
    2023-08-08
  • javascript中JSON.parse()與eval()解析json的區(qū)別

    javascript中JSON.parse()與eval()解析json的區(qū)別

    這篇文章主要介紹了javascript中JSON.parse()與eval()解析json的區(qū)別,詳細描述了json格式數(shù)據(jù)的操作技巧,并結(jié)合實例形式對比分析了使用JSON.parse()與eval()解析json的區(qū)別,需要的朋友可以參考下
    2016-05-05
  • webpack v4 從dev到prd的方法

    webpack v4 從dev到prd的方法

    這篇文章主要介紹了webpack v4 從dev到prd的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

古浪县| 敦化市| 玛纳斯县| 惠东县| 独山县| 临泉县| 台中市| 安仁县| 灵武市| 宿州市| 安溪县| 大渡口区| 临安市| 安国市| 达尔| 莲花县| 永州市| 桂阳县| 阳朔县| 慈利县| 周至县| 肇东市| 邮箱| 黄浦区| 陈巴尔虎旗| 固阳县| 城步| 南涧| 宜兰市| 繁峙县| 莎车县| 循化| 图木舒克市| 翁牛特旗| 武夷山市| 松阳县| 江门市| 潞城市| 平定县| 大姚县| 英山县|