學(xué)習(xí)JavaScript設(shè)計(jì)模式(代理模式)
代理模式是為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)它的訪問
代理模式的用處(個(gè)人理解):為了保障當(dāng)前對(duì)象的單一職責(zé)(相對(duì)獨(dú)立性),而需要?jiǎng)?chuàng)建另一個(gè)對(duì)象來處理調(diào)用當(dāng)前對(duì)象之前的一些邏輯以提高代碼的效率、狀態(tài)判斷等。
代理模式中最常用的是虛擬代理和緩存代理
一、虛擬代理
虛擬代理是把一些開銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建執(zhí)行
示例: 虛擬代理實(shí)現(xiàn)圖片預(yù)加載
// 圖片加載函數(shù) var myImage = (function(){ var imgNode = document.createElement("img"); document.body.appendChild(imgNode); return { setSrc: function(src) { imgNode.src = src; } } })(); // 引入代理對(duì)象 var proxyImage = (function(){ var img = new Image; img.onload = function(){ // 圖片加載完成,正式加載圖片 myImage.setSrc( this.src ); }; return { setSrc: function(src){ // 圖片未被載入時(shí),加載一張?zhí)崾緢D片 myImage.setSrc("file://c:/loading.png"); img.src = src; } } })(); // 調(diào)用代理對(duì)象加載圖片 proxyImage.setSrc( "http://images/qq.jpg");
示例: 虛擬代理合并HTTP請(qǐng)求
假設(shè)一個(gè)功能需要頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,這會(huì)造成相當(dāng)大的開銷,解決方案是通過一個(gè)代理函數(shù)來收集一段時(shí)間之內(nèi)的請(qǐng)求,一次性發(fā)給服務(wù)器。
例如:做一個(gè)文件同步的功能,當(dāng)我們選中一個(gè)文件時(shí),就同步到另外一臺(tái)備用服務(wù)器上
// 文件同步函數(shù) var synchronousFile = function( id ){ console.log( "開始同步文件,id為:" + id ); } // 使用代理合并請(qǐng)求 var proxySynchronousFile = (function(){ var cache = [], // 保存一段時(shí)間內(nèi)需要同步的ID timer; // 定時(shí)器指針 return function( id ){ cache[cache.length] = id; if( timer ){ return; } timer = setTimeout( function(){ proxySynchronousFile( cache.join( "," ) ); // 2s 后向本體發(fā)送需要同步的ID集合 clearTimeout( timer ); // 清空定時(shí)器 timer = null; cache = []; // 晴空定時(shí)器 },2000 ); } })(); // 綁定點(diǎn)擊事件 var checkbox = document.getElementsByTagName( "input" ); for(var i= 0, c; c = checkbox[i++]; ){ c.onclick = function(){ if( this.checked === true ){ // 使用代理進(jìn)行文件同步 proxySynchronousFile( this.id ); } } }
二、 緩存代理
緩存代理可以為一些開銷大的運(yùn)算結(jié)果提供暫時(shí)的存儲(chǔ),在下次運(yùn)算時(shí),如果傳遞進(jìn)來的參數(shù)跟之前一致,則可以返回前面的運(yùn)算結(jié)果。
示例: 為乘法、加法等創(chuàng)建緩存代理
// 計(jì)算乘積 var mult = function(){ var a = 1; for( var i = 0, l = arguments.length; i < l; i++){ a = a * arguments[i]; } return a; }; // 計(jì)算加和 var plus = function () { var a = 0; for( var i = 0, l = arguments.length; i < l; i++ ){ a += arguments[i]; } return a; }; // 創(chuàng)建緩存代理的工廠 var createProxyFactory = function( fn ){ var cache = {}; // 緩存 - 存放參數(shù)和計(jì)算后的值 return function(){ var args = Array.prototype.join.call(arguments, "-"); if( args in cache ){ // 判斷出入的參數(shù)是否被計(jì)算過 console.log( "使用緩存代理" ); return cache[args]; } return cache[args] = fn.apply( this, arguments ); } }; // 創(chuàng)建代理 var proxyMult = createProxyFactory( mult ), proxyPlus = createProxyFactory( plus ); console.log( proxyMult( 1, 2, 3, 4 ) ); // 輸出: 24 console.log( proxyMult( 1, 2, 3, 4 ) ); // 輸出: 緩存代理 24 console.log( proxyPlus( 1, 2, 3, 4 ) ); // 輸出: 10 console.log( proxyPlus( 1, 2, 3, 4 ) ); // 輸出: 緩存代理 10
以上三個(gè)示例為大家詳細(xì)介紹了javascript代理模式,希望對(duì)大家的學(xué)習(xí)有所幫助。
- javascript設(shè)計(jì)模式 – 代理模式原理與用法實(shí)例分析
- js設(shè)計(jì)模式之代理模式及訂閱發(fā)布模式實(shí)例詳解
- 詳解javascript設(shè)計(jì)模式三:代理模式
- JavaScript設(shè)計(jì)模式之代理模式實(shí)例分析
- JavaScript設(shè)計(jì)模式之緩存代理模式原理與簡(jiǎn)單用法示例
- JavaScript設(shè)計(jì)模式之代理模式簡(jiǎn)單實(shí)例教程
- JavaScript設(shè)計(jì)模式之代理模式詳解
- JavaScript的設(shè)計(jì)模式經(jīng)典之代理模式
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之代理模式
- 深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解
- JavaScript設(shè)計(jì)模式之代理模式介紹
- JavaScript設(shè)計(jì)模式學(xué)習(xí)之代理模式
相關(guān)文章
利用jsonp跨域調(diào)用百度js實(shí)現(xiàn)搜索框智能提示
這篇文章主要為大家詳細(xì)介紹了使用jsonp跨域調(diào)用百度js實(shí)現(xiàn)搜索框智能提示,感興趣的小伙伴們可以參考一下2016-08-08Bootstrap3 多個(gè)模態(tài)對(duì)話框無法顯示的解決方案
這篇文章主要介紹了Bootstrap3 多個(gè)模態(tài)對(duì)話框無法顯示的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02javascript中的startWith和endWith的幾種實(shí)現(xiàn)方法
javascript中的startWith和endWith的幾種實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05JavaScript原生數(shù)組函數(shù)實(shí)例匯總
這篇文章主要介紹了JavaScript原生數(shù)組函數(shù)實(shí)例匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10JS實(shí)現(xiàn)屏蔽網(wǎng)頁右鍵復(fù)制及ctrl+c復(fù)制的方法【2種方法】
這篇文章主要介紹了JS實(shí)現(xiàn)屏蔽網(wǎng)頁右鍵復(fù)制及ctrl+c復(fù)制的方法,結(jié)合實(shí)例形式分析了2種比較常用的屏蔽復(fù)制功能的技巧,需要的朋友可以參考下2016-09-09javascript數(shù)字格式化通用類 accounting.js使用
accounting.js 是一個(gè)非常小的JavaScript方法庫(kù)用于對(duì)數(shù)字,金額和貨幣進(jìn)行格式化。并提供可選的Excel風(fēng)格列渲染。它沒有依賴任何JS框架。貨幣符號(hào)等可以按需求進(jìn)行定制2012-08-08使用Javascript和DOM Interfaces來處理HTML
使用Javascript和DOM Interfaces來處理HTML...2006-10-10純JavaScript實(shí)現(xiàn)的完美漸變彈出層效果代碼
對(duì)于Web項(xiàng)目開發(fā)尤其是前臺(tái)UI的設(shè)計(jì)而言,用戶體驗(yàn)至關(guān)重要,因?yàn)樗苯雨P(guān)系到項(xiàng)目的成敗,簡(jiǎn)潔,平滑,優(yōu)雅的設(shè)計(jì)永遠(yuǎn)能夠受到用戶的青睞。2010-04-04如何在selenium中使用js實(shí)現(xiàn)定位
這篇文章主要介紹了如何在selenium中使用js實(shí)現(xiàn)定位,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08