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

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

 更新時(shí)間:2016年01月12日 17:16:40   作者:奮飛  
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的狀態(tài)模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下
  • 明星都有經(jīng)紀(jì)人作為代理。如果請(qǐng)明星辦一場(chǎng)商演,只能聯(lián)系其經(jīng)紀(jì)人,經(jīng)紀(jì)人會(huì)把商演的細(xì)節(jié)和報(bào)酬談好,再把合同交給明星簽。

一、定義

代理模式:為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)它的訪問。
代理分為:保護(hù)代理和虛擬代理
保護(hù)代理:用于控制不同權(quán)限的對(duì)象對(duì)目標(biāo)對(duì)象的訪問,在JavaScript中很難判斷誰訪問了某個(gè)對(duì)象,所以保護(hù)代理很難實(shí)現(xiàn)。

二、圖片預(yù)加載(最常見的虛擬代理應(yīng)用場(chǎng)景)

圖片預(yù)加載是一種常用技術(shù),如果直接給某個(gè)img標(biāo)簽節(jié)點(diǎn)設(shè)置src屬性,由于圖片過大或者網(wǎng)絡(luò)不佳,圖片的位置往往有段時(shí)間會(huì)有空白。常見的做法事先用一張loading圖片占位,然后異步加載圖片,待圖片加載完成,把其填充到img節(jié)點(diǎn)里。
實(shí)現(xiàn)原理:
創(chuàng)建一個(gè)Image對(duì)象:var a = new Image();
定義Image對(duì)象的src: a.src = “xxx.gif”;
這樣做就相當(dāng)于給瀏覽器緩存了一張圖片。

可通過Image對(duì)象的complete屬性來檢測(cè)圖像是否加載完成。每個(gè)Image對(duì)象都有一個(gè)complete屬性,當(dāng)圖像處于裝載過程中時(shí),該屬性值false,當(dāng)發(fā)生了onload、onerror、onabort中任何一個(gè)事件后,則表示圖像裝載過程結(jié)束,此時(shí)complete屬性為true。

(1)非代理實(shí)現(xiàn)

var myImage = (function() {
  var imgNode = document.createElement("img");
  document.body.appendChild(imgNode);
  var img = new Image();

  img.onload = function() {
    imgNode.src = img.src;
  };

  return {
    setSrc: function(src) {
      imgNode.src = "./images/loading.gif";
      img.src = src;
    }
  }
})();

myImage.setSrc("./images/originImg.png");

(2)代理實(shí)現(xiàn)

// 創(chuàng)建圖片DOM
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);  // this指向img!img加載完成后,將img.src傳遞給myImage
  };

  return {
    setSrc: function(src) {
      myImage.setSrc("./images/loading.gif");   // loading
      img.src = src;
    }
  };
})();

proxyImage.setSrc("./images/originImg.png");

使用代理模式的好處:使每個(gè)函數(shù)功能單一,實(shí)現(xiàn)對(duì)象設(shè)計(jì)的“單一職責(zé)原則”!

三、文件同步

假設(shè)我們?cè)谧鲆粋€(gè)文件同步功能,當(dāng)選中checkbox時(shí)候,它對(duì)應(yīng)的文件就會(huì)被同步到另外一臺(tái)服務(wù)器。

<body>
    <input type="checkbox" id="1" />文件1
    <input type="checkbox" id="2" />文件2
    <input type="checkbox" id="3" />文件3
    <input type="checkbox" id="4" />文件4
    <input type="checkbox" id="5" />文件5
    <input type="checkbox" id="6" />文件6
  </body>

沒選中一個(gè)checkbox就同步一次,顯然不太合理。因?yàn)樵趙eb開發(fā)中,最大的開銷就是網(wǎng)絡(luò)請(qǐng)求。
解決方案:通過一個(gè)代理函數(shù)來收集一段時(shí)間之內(nèi)的請(qǐng)求,然后一次性發(fā)給服務(wù)器。

var synchronousFile = function(id) {
  console.log("開始同步文件,id為:" + id);
};

var proxySynchonousFile = (function() {
  var cache = [],   // 保存本次需要同步文件的id
    timer;     // 定時(shí)器

  return function(id) {
    cache.push(id);
    if(timer) { 
      // 不要覆蓋已經(jīng)啟動(dòng)的定時(shí)
      return;
    }

    timer = setTimeout(function(){
      synchronousFile(cache.join(","));
      clearTimeout(timer);
      timer = null;
      cache.length = 0;  // 清空緩存
    }, 2000);
  }
})();

var checkboxs = document.getElementsByTagName("input");

for(var i = 0, c; c = checkboxs[i]; i++) {
  c.onclick = function() {
    if(this.checked === true) {
      proxySynchonousFile(this.id);
    }
  }
}

四、緩存代理–計(jì)算乘積(序列一模一樣)

var mult = function() {
  var result = 1;
  for(var i = 0, l = arguments.length; i < l; i++) {
    result= result * arguments[i];
  }
  return result;
};

var proxyMult = (function() {
  var cache = {};   // {"1,2,3": 6}
  return function() {
    var args = Array.prototype.join.call(arguments, ",");
    if(args in cache) {
      return cache[args];
    }
    return cache[args] = mult.apply(this, arguments);
  }
})();

console.log(proxyMult(1, 2, 3));

// 改造:

var proxyFactory = function(fn) {
  var cache = {};
  return function() {
    var args = Array.prototype.join.call(arguments, ",");
    if(args in cache) {
      return cache[args];
    }
    return cache[args] = fn.apply(this, arguments);
  }  
};

console.log(proxyFactory(mult)(1, 2, 3));

希望本文所述對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • JavaScript中?.?和??分別是什么詳解

    JavaScript中?.?和??分別是什么詳解

    在項(xiàng)目中我們往往要做很多很多的空值判斷進(jìn)行容錯(cuò)處理,往往伴隨著三目運(yùn)算、與或、if else來使用,下面這篇文章主要給大家介紹了關(guān)于JavaScript中?.?和??分別是什么的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • JS中多步驟多分步的StepJump組件實(shí)例詳解

    JS中多步驟多分步的StepJump組件實(shí)例詳解

    這篇文章主要介紹了JS中多步驟多分步的StepJump組件實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • 原生JavaScript實(shí)現(xiàn)輪播圖

    原生JavaScript實(shí)現(xiàn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 如何利用ES6進(jìn)行Promise封裝總結(jié)

    如何利用ES6進(jìn)行Promise封裝總結(jié)

    這篇文章主要介紹了如何利用ES6進(jìn)行Promise封裝總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 微信小程序調(diào)用微信支付接口的實(shí)現(xiàn)方法

    微信小程序調(diào)用微信支付接口的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信小程序調(diào)用微信支付接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 教你使用webpack打包編譯TypeScript代碼

    教你使用webpack打包編譯TypeScript代碼

    TypeScript同樣也可以結(jié)合構(gòu)建工具一起使用,下邊以webpack為例介紹一下如何結(jié)合構(gòu)建工具使用TypeScript,本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • webpack+express實(shí)現(xiàn)文件精確緩存的示例代碼

    webpack+express實(shí)現(xiàn)文件精確緩存的示例代碼

    這篇文章主要介紹了webpack+express實(shí)現(xiàn)文件精確緩存的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • ES6新特性七:數(shù)組的擴(kuò)充詳解

    ES6新特性七:數(shù)組的擴(kuò)充詳解

    這篇文章主要介紹了ES6新特性之?dāng)?shù)組的擴(kuò)充,結(jié)合實(shí)例形式分析了ES6數(shù)組操作的常見方法與相關(guān)使用技巧,需要的朋友可以參考下
    2017-04-04
  • js判斷一個(gè)元素是否為另一個(gè)元素的子元素的代碼

    js判斷一個(gè)元素是否為另一個(gè)元素的子元素的代碼

    用js判斷一個(gè)元素是否為另一個(gè)元素的子元素,再做一些效果的時(shí)候經(jīng)常用到,特別是和鼠標(biāo)事件相關(guān)的應(yīng)用中,比如一個(gè)浮層,在鼠標(biāo)操作浮層內(nèi)元素的時(shí)候浮層顯示,當(dāng)點(diǎn)擊浮層外的元素的時(shí)候隱藏浮層
    2012-03-03
  • 小程序?qū)崿F(xiàn)抽獎(jiǎng)動(dòng)畫

    小程序?qū)崿F(xiàn)抽獎(jiǎng)動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)抽獎(jiǎng)動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論

金坛市| 达州市| 利川市| 航空| 红河县| 六枝特区| 宣威市| 沾化县| 顺昌县| 乐昌市| 沾化县| 达孜县| 连平县| 平陆县| 富锦市| 新乡县| 叙永县| 丹江口市| 阜平县| 运城市| 锡林浩特市| 讷河市| 安远县| 湖口县| 响水县| 阜新市| 阳高县| 昔阳县| 东乡| 龙胜| 青龙| 安阳县| 依安县| 平凉市| 永福县| SHOW| 梁山县| 离岛区| 岚皋县| 长寿区| 广水市|