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

JavaScript設(shè)計(jì)模式之代理模式詳解

 更新時(shí)間:2017年06月09日 14:49:08   作者:Stinchan  
這篇文章主要為大家詳細(xì)介紹了JavaScript設(shè)計(jì)模式之代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

代理模式是非常常見(jiàn)的模式,比如我們使用的VPN工具,明星的經(jīng)紀(jì)人,都是代理模式的例子。但是,有人會(huì)疑問(wèn),明明可以直接訪問(wèn)對(duì)象,為什么中間還要加一個(gè)殼呢?這也就說(shuō)到了代理模式的好處。在我看來(lái),代理模式最大的好處,就是在不動(dòng)原有對(duì)象的同時(shí),可以給原有對(duì)象增加一些新的特性或者行為。

/**
 * pre:代理模式
 * 小明追求A,B是A的好朋友,小明比較靦腆,不好意思直接將花交給A,
 * 于是小明將花交給B,再由B交給A.
 */
//----------- 示例1 ---------
// 不使用代理
var Flower = function() {};
var xiaoming = {
  sendFlower: function(target) {
    var flower = new Flower();
    target.receiveFlower(flower);
  }
};
var A = {
  receiveFlower: function(flower) {
    console.log("收到花:" + flower);
  }
};
xiaoming.sendFlower(A);

// ----------- 示例2 --------------
// 使用代理1
var Flower = function() {};
var xiaoming = {
  sendFlower: function(target) {
    var flower = new Flower();
    B.receiveFlower(flower);
  }
};
var B = {
  receiveFlower: function(flower) {
    A.receiveFlower(flower);
  }
};
var A = {
  receiveFlower: function(flower) {
    console.log("收到花:" + flower);
  }
};
xiaoming.sendFlower(B);

//------------- 示例3 ---------------
/* 
 * 使用代理2
 * 從示例1和示例2,看不出使用代理有什么用處,B只不過(guò)是從中間轉(zhuǎn)手了一次。
 * 接下來(lái),我們想一下。給喜歡的人送花,怎樣才能提高成功率呢?
 * 我們都知道,人有心情好和心情差的時(shí)候,當(dāng)美女心情好的時(shí)候,送花成功的概率自然要大些。
 * 于是,我們將代理升級(jí),監(jiān)聽(tīng)美女的心情,心情好的時(shí)候再給她送花。
 * 為了演示,我們假設(shè)2秒后,A的心情變好。
 */

var Flower = function() {};
var xiaoming = {
  sendFlower: function(target) {
    var flower = new Flower();
    B.receiveFlower(flower);
  }
};
var B = {
  receiveFlower: function(flower) {
    A.listenGoodMood(function() {
      A.receiveFlower(flower);
    });
  }
};
var A = {
  receiveFlower: function(flower) {
    console.log("收到花:" + flower);
  },
  listenGoodMood: function(fn) {
    setTimeout(function() {
      fn.apply(this, arguments);
    }, 2000);
  }
};
xiaoming.sendFlower(B);
// ---------- 示例4 ---------------
/*
 * 【代理模式用處】:虛擬代理
 * 這里以加載圖片為例,我們都知道當(dāng)網(wǎng)絡(luò)不暢以及圖片過(guò)大時(shí),圖片加載都比較慢,
 * 為了更好的用戶體驗(yàn),我們都會(huì)在原圖片未加載完成前,加上loading圖片。
 * */
//--4 _01未使用代理--
var myImage = (function() {
  var imgNode = document.createElement("img");
  document.body.appendChild(imgNode);
  return {
    setSrc: function(src) {
      this.imgNode.src = src;
    }
  }
})();
myImage.setSrc("xxx");
//--4_02使用代理--
var proxyMyImage = (function() {
  var img = new Image();
  img.onload = function() {
    myImage.setSrc(this.src);
  };
  return {
    setSrc: function(src) {
      myImage.setSrc("loading.jpg");
      img.src = src;
    }
  }
})();
proxyMyImage.setSrc("xxx");
/*
 * [注]:這里可以看到代理模式的好處:在不改變?cè)薪涌诘耐瑫r(shí),可以為系統(tǒng)添加新的行為。
 */
//--------- 示例5---------------
/*
 * 【代理模式用處】:合并http請(qǐng)求
 * 這里以選擇文件同步為例。
 * 以往用戶同步文件,在用戶選中的時(shí)候就觸發(fā),這種方法做到了實(shí)時(shí)性,但無(wú)疑增加了網(wǎng)絡(luò)的開(kāi)銷(xiāo)。
 * 實(shí)際在使用的過(guò)程中,往往并不需要立刻就同步。
 * 以下通過(guò)代理模式,將在用戶選中文件2秒后進(jìn)行同步請(qǐng)求。
 * */
// --- 包含一段html代碼,請(qǐng)自行添加到一個(gè)文件中 ------
<html>
  <body>
    <button id="input">點(diǎn)我上傳</button>
    <input type="checkbox" id="1"></input>1
    <input type="checkbox" id="2"></input>2
    <input type="checkbox" id="3"></input>3
    <input type="checkbox" id="4"></input>4
    <input type="checkbox" id="5"></input>5
    <input type="checkbox" id="6"></input>6
    <input type="checkbox" id="7"></input>7
    <input type="checkbox" id="8"></input>8
    <input type="checkbox" id="9"></input>9
  </body>
</html>
// -- 上傳文件 --
var synchronizeFile = function(id) {
  console.log("開(kāi)始同步文件:" + id);
};
var proxySynchronizeFiles = (function() {
  var fileCache = [],
    timer;
  return function(id) {
    fileCache.push(id);
    if(timer) {
      return;
    }
    timer = setTimeout(function() {
      synchronizeFile(fileCache.join(","));
      clearTimeout(timer);
      timer = null;
      checkArr.length = 0;
    }, 2000);
  }
})();
var checkArr = document.getElementsByTagName("input");
for(var i = 0, c; c = checkArr[i++];) {
  c.onclick = function() {
    if(this.checked == true) {
      proxySynchronizeFiles(this.id);
    }
  }
}
// ------------ 示例6 -----------------
/*
 * 【代理模式用處】:緩存代理
 * 以計(jì)算器為例,比如計(jì)算某些數(shù)的乘積,當(dāng)參數(shù)重復(fù)時(shí),我們希望不用重復(fù)計(jì)算,直接返回結(jié)果。
 * 以下用到代理模式做緩存。
 */
var mult = function() {
  if(!arguments) {
    console.log("請(qǐng)輸入?yún)?shù)");
    return;
  }
  var a = 1;
  for(var i = 0, b; b = arguments[i++];) {
    a = a * b;
  }
  return a;
};

var proxyMult = (function() {
  var cache = {};
  return function() {
    var str = Array.prototype.join.call(arguments, ",");
    if(str in cache) {
      console.log("重復(fù)return.");
      return cache[str];
    }
    return cache[str] = mult.apply(this, arguments);
  }
})();

console.log(proxyMult(2, 3, 4));
console.log(proxyMult(2, 3, 4));
//------------ 示例7 --------------
/*
 * 緩存代理升級(jí) - 通用版計(jì)算
 * 
 */
var mult = function() {
  if(!arguments) {
    return;
  }
  var t = 1;
  for(var i = 0, a; a = arguments[i++];) {
    t = t * a;
  }
  return t;
};
var plus = function() {
  if(!arguments) {
    return;
  }
  var t = 0;
  for(var a of arguments) {
    t += a;
  }
  return t;
};
var createProxyCaculate = function(fn) {
  var cache = {};
  return function() {
    var str = Array.prototype.join.call(arguments, ",");
    if(str in cache) {
      console.log("重復(fù)return" + str);
      return cache[str];
    }
    return cache[str] = fn.apply(this, arguments);
  }
};
var proxyMult = createProxyCaculate(mult);
var proxyPlus = createProxyCaculate(plus);
console.log(proxyMult(2, 3, 4));
console.log(proxyMult(2, 3, 4));

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)帶滑塊的進(jìn)度條

    微信小程序?qū)崿F(xiàn)帶滑塊的進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)帶滑塊的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • js DOM的事件常見(jiàn)操作實(shí)例詳解

    js DOM的事件常見(jiàn)操作實(shí)例詳解

    這篇文章主要介紹了js DOM的事件常見(jiàn)操作,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript DOM事件概念、原理及DOM操作常見(jiàn)實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Javascript創(chuàng)建Silverlight Plugin以及自定義nonSilverlight和lowSilverlight樣式

    Javascript創(chuàng)建Silverlight Plugin以及自定義nonSilverlight和lowSilverl

    我們?cè)谑褂肰isual Studio IDE創(chuàng)建Silverlight工程時(shí),默認(rèn)情況下都會(huì)自動(dòng)生成一個(gè)用于調(diào)試和預(yù)覽Silverlight的Web工程,該工程包含了html和aspx頁(yè)面,以及Silverlight.js腳本文件。
    2010-06-06
  • js中Generator函數(shù)的深入講解

    js中Generator函數(shù)的深入講解

    這篇文章主要給大家介紹了關(guān)于js中Generator函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Javascript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaScript中的10個(gè)常見(jiàn)錯(cuò)誤及解決方法

    JavaScript中的10個(gè)常見(jiàn)錯(cuò)誤及解決方法

    JavaScript 作為最流行的編程語(yǔ)言之一,為絕大多數(shù)網(wǎng)站和應(yīng)用提供動(dòng)力,然而,其靈活性和動(dòng)態(tài)特性有時(shí)會(huì)導(dǎo)致常見(jiàn)錯(cuò)誤,本文將探討 JavaScript 中的 10 個(gè)常見(jiàn)錯(cuò)誤,并提供相應(yīng)的解決方案,需要的朋友可以參考下
    2024-09-09
  • ES6新特性一: let和const命令詳解

    ES6新特性一: let和const命令詳解

    這篇文章主要介紹了ES6新特性中的let和const命令,結(jié)合實(shí)例形式分析了let和const命令的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • 在knockoutjs 上自己實(shí)現(xiàn)的flux(實(shí)例講解)

    在knockoutjs 上自己實(shí)現(xiàn)的flux(實(shí)例講解)

    下面小編就為大家分享一篇在knockoutjs 上自己實(shí)現(xiàn)的flux方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 小程序?qū)崿F(xiàn)購(gòu)物車(chē)完整版

    小程序?qū)崿F(xiàn)購(gòu)物車(chē)完整版

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)購(gòu)物車(chē)完整版,實(shí)現(xiàn)加減計(jì)算數(shù)量跟金額,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Bootstrap中定制LESS-顏色及導(dǎo)航條(推薦)

    Bootstrap中定制LESS-顏色及導(dǎo)航條(推薦)

    這篇文章主要介紹了Bootstrap中定制LESS-顏色及導(dǎo)航條的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-11-11
  • javascript 鼠標(biāo)拖動(dòng)圖標(biāo)技術(shù)

    javascript 鼠標(biāo)拖動(dòng)圖標(biāo)技術(shù)

    剛剛學(xué)習(xí)了個(gè)js的小技術(shù),還蠻好玩的,以后會(huì)把做的一些小例子貼上來(lái),方便自己也可以跟大家一起分享學(xué)習(xí)成果,哈哈~~
    2010-02-02

最新評(píng)論

永善县| 屯昌县| 炎陵县| 荆门市| 镇远县| 吐鲁番市| 昭平县| 余庆县| 东源县| 博兴县| 南丹县| 邵东县| 宜州市| 赤城县| 英吉沙县| 乌兰察布市| 澎湖县| 错那县| 顺昌县| 疏附县| 青浦区| 酉阳| 邢台县| 汕尾市| 开原市| 宁明县| 新疆| 武冈市| 高邑县| 安吉县| 红河县| 阜新市| 黄山市| 巫溪县| 资阳市| 门头沟区| 醴陵市| 宜州市| 宜阳县| 石台县| 阜南县|