国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

學習JavaScript設計模式之代理模式

2024-05-06 16:27:44
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要為大家介紹了JavaScript設計模式中的狀態(tài)模式,對JavaScript設計模式感興趣的小伙伴們可以參考一下
 
  • 明星都有經(jīng)紀人作為代理。如果請明星辦一場商演,只能聯(lián)系其經(jīng)紀人,經(jīng)紀人會把商演的細節(jié)和報酬談好,再把合同交給明星簽。

一、定義

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

二、圖片預加載(最常見的虛擬代理應用場景)

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

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

(1)非代理實現(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)代理實現(xiàn)

// 創(chuàng)建圖片DOMvar 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");

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

三、文件同步

假設我們在做一個文件同步功能,當選中checkbox時候,它對應的文件就會被同步到另外一臺服務器。

<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>

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

var synchronousFile = function(id) {  console.log("開始同步文件,id為:" + id);};var proxySynchonousFile = (function() {  var cache = [],   // 保存本次需要同步文件的id    timer;     // 定時器  return function(id) {    cache.push(id);    if(timer) {       // 不要覆蓋已經(jīng)啟動的定時      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);    }  }}

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

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));

希望本文所述對大家學習javascript程序設計有所幫助。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 铜鼓县| 什邡市| 潞城市| 衡东县| 尤溪县| 麻城市| 庆元县| 那坡县| 淮北市| 蒙阴县| 常山县| 肥东县| 阳城县| 旬邑县| 邛崃市| 石屏县| 邵阳市| 盐城市| 吴江市| 安多县| 铅山县| 乐都县| 瑞丽市| 桐庐县| 泾川县| 无锡市| 分宜县| 噶尔县| 镇巴县| 宜良县| 平利县| 镇平县| 安远县| 宽城| 九龙县| 郯城县| 贡嘎县| 抚顺市| 洞口县| 泸溪县| 新田县|