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

首頁 > 開發 > JS > 正文

js設計模式之代理模式及訂閱發布模式實例詳解

2024-05-06 16:54:14
字體:
來源:轉載
供稿:網友

本文實例講述了js設計模式之代理模式及訂閱發布模式。分享給大家供大家參考,具體如下:

為啥將兩種模式放在一起呢?因為這樣文章比較長啊。

寫博客的目的我覺得首要目的是整理自己的知識點,進而優化個人所得知識體系。知識成為個人的知識,就在于能夠用自己的話表達同一種意義。

本文是設計模式系列文章的第二篇文章,第一篇:。

1,代理模式,只是學習了虛擬代理以及緩存代理,具體案例

1)虛擬代理

//業務代碼var myImage = (function() {    var imgNode = document.createElement("img");    document.body.appendChild(imgNode);    return {      setSrc: function(src) {        console.log(1111);        imgNode.src = src;      }    }})();// 設計模式代碼var ProxyImage = (function() {    var img = new Image();    //這個img只是用來判斷圖片是否加載完成,加載完成之后修改圖片鏈接    img.onload = function() {      console.log(this);      myImage.setSrc(this.src);    };    return {      setSrc: function(src) {        console.log(22);        myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif");        img.src = src;      }    }})();

這個例子好吧,拿來主義。說一下自己的理解:上面的業務代碼實現的是將一個圖片dom插入到dom樹之中,代理模式則是通過創建一個新的img元素,通過判斷onload判斷是否加載完成,然后替換原有鏈接。

2)下面是緩存代理:

<script>//緩存代理// 計算乘法var mult = function() {    var a = 1;    for (var i = 0, ilen = arguments.length; i < ilen; i += 1) {      a = a * arguments[i];    }    return a;};// 代理函數var proxyFunc = 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);    }};var proxyMult = proxyFunc(mult);console.log(proxyMult(1, 2, 3, 4)); // 24console.log(proxyMult(1, 2, 3, 4)); // 緩存取 24</script>

運行結果:

js,設計模式,代理模式,訂閱發布模式

就是利用閉包實現原有計算數據的緩存。

2,訂閱發布模式

<script>var Event = (function(){  var list = {},     listen,     trigger,     remove;     //添加訂閱對象     listen = function(key,fn){      if(!list[key]) {        list[key] = [];      }      list[key].push(fn);    };    //觸發訂閱內容    trigger = function(){      var key = Array.prototype.shift.call(arguments),         fns = list[key];      if(!fns || fns.length === 0) {        return false;      }      for(var i = 0, fn; fn = fns[i++];) {        fn.apply(this,arguments);      }    };    //刪除訂閱內容    remove = function(key,fn){      var fns = list[key];      if(!fns) {        return false;      }      if(!fn) {        fns && (fns.length = 0);      }else {        for(var i = fns.length - 1; i >= 0; i--){          var _fn = fns[i];          if(_fn === fn) {            fns.splice(i,1);          }        }      }    };    return {      listen: listen,      trigger: trigger,      remove: remove    }})();// 測試代碼如下:Event.listen("color",function(size) {  console.log("尺碼為:"+size); // 打印出尺碼為42});Event.trigger("color",42);</script>

運行結果:

js,設計模式,代理模式,訂閱發布模式

本質上,上述的發布訂閱只是一個數組的增刪改查。緩存下增刪改查。

本文結束。

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永宁县| 临泉县| 灵宝市| 斗六市| 壶关县| 新郑市| 全椒县| 吉隆县| 洞头县| 武安市| 灵宝市| 海口市| 新绛县| 福泉市| 湘西| 营口市| 法库县| 清水县| 桐庐县| 博乐市| 开封县| 江津市| 格尔木市| 民乐县| 安化县| 牟定县| 惠来县| 惠安县| 昭平县| 东安县| 苏尼特右旗| 兴安盟| 无极县| 屏南县| 桂平市| 贵州省| 徐闻县| 阿城市| 营山县| 昔阳县| 社会|