這篇文章將為大家詳細(xì)講解有關(guān)js設(shè)計(jì)模式之代理模式及訂閱發(fā)布模式的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供西工網(wǎng)站建設(shè)、西工做網(wǎng)站、西工網(wǎng)站設(shè)計(jì)、西工網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、西工企業(yè)網(wǎng)站模板建站服務(wù),十多年西工做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。1,代理模式,只是學(xué)習(xí)了虛擬代理以及緩存代理,具體案例
1)虛擬代理
//業(yè)務(wù)代碼 var myImage = (function() { var imgNode = document.createElement("img"); document.body.appendChild(imgNode); return { setSrc: function(src) { console.log(1111); imgNode.src = src; } } })(); // 設(shè)計(jì)模式代碼 var ProxyImage = (function() { var img = new Image(); //這個(gè)img只是用來(lái)判斷圖片是否加載完成,加載完成之后修改圖片鏈接 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; } } })();
這個(gè)例子好吧,拿來(lái)主義。說(shuō)一下自己的理解:上面的業(yè)務(wù)代碼實(shí)現(xiàn)的是將一個(gè)圖片dom插入到dom樹(shù)之中,代理模式則是通過(guò)創(chuàng)建一個(gè)新的img元素,通過(guò)判斷onload判斷是否加載完成,然后替換原有鏈接。
2)下面是緩存代理:
<script> //緩存代理 // 計(jì)算乘法 var mult = function() { var a = 1; for (var i = 0, ilen = arguments.length; i < ilen; i += 1) { a = a * arguments[i]; } return a; }; // 代理函數(shù) var proxyFunc = function(fn) { var cache = {}; // 緩存對(duì)象 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)); // 24 console.log(proxyMult(1, 2, 3, 4)); // 緩存取 24 </script>
運(yùn)行結(jié)果:
就是利用閉包實(shí)現(xiàn)原有計(jì)算數(shù)據(jù)的緩存。
2,訂閱發(fā)布模式
<script> var Event = (function(){ var list = {}, listen, trigger, remove; //添加訂閱對(duì)象 listen = function(key,fn){ if(!list[key]) { list[key] = []; } list[key].push(fn); }; //觸發(fā)訂閱內(nèi)容 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); } }; //刪除訂閱內(nèi)容 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 } })(); // 測(cè)試代碼如下: Event.listen("color",function(size) { console.log("尺碼為:"+size); // 打印出尺碼為42 }); Event.trigger("color",42); </script>
運(yùn)行結(jié)果:
本質(zhì)上,上述的發(fā)布訂閱只是一個(gè)數(shù)組的增刪改查。緩存下增刪改查。
關(guān)于“js設(shè)計(jì)模式之代理模式及訂閱發(fā)布模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
本文標(biāo)題:js設(shè)計(jì)模式之代理模式及訂閱發(fā)布模式的示例分析-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://vcdvsql.cn/article22/deoojc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、用戶體驗(yàn)、網(wǎng)站設(shè)計(jì)、微信小程序、企業(yè)網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容