成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你對代理模式的理解?應用場景?

開發 前端
代理模式的關鍵是,當客戶不方便直接訪問一個對象或者不滿足需要時,提供一個替身對象來控制這個對象的訪問,客戶實際上訪問的是替身對象。

[[433461]]

一、是什么

代理模式(Proxy Pattern)是為一個對象提供一個代用品或占位符,以便控制對它的訪問

代理模式的關鍵是,當客戶不方便直接訪問一個對象或者不滿足需要時,提供一個替身對象來控制這個對象的訪問,客戶實際上訪問的是替身對象

在生活中,代理模式的場景是十分常見的,例如我們現在如果有租房、買房的需求,更多的是去找鏈家等房屋中介機構,而不是直接尋找想賣房或出租房的人談。此時,鏈家起到的作用就是代理的作用

二、使用

在ES6中,存在proxy構建函數能夠讓我們輕松使用代理模式:

  1. const proxy = new Proxy(target, handler); 

關于Proxy的使用可以翻看以前的文章

而按照功能來劃分,javascript代理模式常用的有:

  • 緩存代理
  • 虛擬代理

緩存代理

緩存代理可以為一些開銷大的運算結果提供暫時的存儲,在下次運算時,如果傳遞進來的參數跟之前一致,則可以直接返回前面存儲的運算結果

如實現一個求積乘的函數,如下:

  1. var muti = function () { 
  2.   console.log("開始計算乘積"); 
  3.   var a = 1; 
  4.   for (var i = 0, l = arguments.length; i < l; i++) { 
  5.     a = a * arguments[i]; 
  6.   } 
  7.   return a; 
  8. }; 

現在加入緩存代理,如下:

  1. var proxyMult = (function () { 
  2.   var cache = {}; 
  3.   return function () { 
  4.     var args = Array.prototype.join.call(arguments, ","); 
  5.     if (args in cache) { 
  6.       return cache[args]; 
  7.     } 
  8.     return (cache[args] = mult.apply(this, arguments)); 
  9.   }; 
  10. })(); 
  11.  
  12. proxyMult(1, 2, 3, 4); // 輸出:24 
  13. proxyMult(1, 2, 3, 4); // 輸出:24 

當第二次調用 proxyMult(1, 2, 3, 4) 時,本體 mult 函數并沒有被計算,proxyMult 直接返回了之前緩存好的計算結果

虛擬代理

虛擬代理把一些開銷很大的對象,延遲到真正需要它的時候才去創建

常見的就是圖片預加載功能:

未使用代理模式如下:

  1. let MyImage = (function(){ 
  2.     let imgNode = document.createElement( 'img' ); 
  3.     document.body.appendChild( imgNode ); 
  4.     // 創建一個Image對象,用于加載需要設置的圖片 
  5.     let img = new Image; 
  6.  
  7.     img.onload = function(){ 
  8.         // 監聽到圖片加載完成后,設置src為加載完成后的圖片 
  9.         imgNode.src = img.src; 
  10.     }; 
  11.  
  12.     return { 
  13.         setSrc: function( src ){ 
  14.             // 設置圖片的時候,設置為默認的loading圖 
  15.             imgNode.src = 'https://img.zcool.cn/community/01deed576019060000018c1bd2352d.gif'
  16.             // 把真正需要設置的圖片傳給Image對象的src屬性 
  17.             img.src = src; 
  18.         } 
  19.     } 
  20. })(); 
  21.  
  22. MyImage.setSrc( 'https://xxx.jpg' ); 

MyImage對象除了負責給img節點設置src外,還要負責預加載圖片,違反了面向對象設計的原則——單一職責原則

上述過程loding則是耦合進MyImage對象里的,如果以后某個時候,我們不需要預加載顯示loading這個功能了,就只能在MyImage對象里面改動代碼

使用代理模式,代碼則如下:

  1. // 圖片本地對象,負責往頁面中創建一個img標簽,并且提供一個對外的setSrc接口 
  2. let myImage = (function(){ 
  3.     let imgNode = document.createElement( 'img' ); 
  4.     document.body.appendChild( imgNode ); 
  5.  
  6.     return { 
  7.         //setSrc接口,外界調用這個接口,便可以給該img標簽設置src屬性 
  8.         setSrc: function( src ){ 
  9.             imgNode.src = src; 
  10.         } 
  11.     } 
  12. })(); 
  13. // 代理對象,負責圖片預加載功能 
  14. let proxyImage = (function(){ 
  15.     // 創建一個Image對象,用于加載需要設置的圖片 
  16.     let img = new Image; 
  17.     img.onload = function(){ 
  18.         // 監聽到圖片加載完成后,給被代理的圖片本地對象設置src為加載完成后的圖片 
  19.         myImage.setSrc( this.src ); 
  20.     } 
  21.     return { 
  22.         setSrc: function( src ){ 
  23.             // 設置圖片時,在圖片未被真正加載好時,以這張圖作為loading,提示用戶圖片正在加載 
  24.             myImage.setSrc( 'https://img.zcool.cn/community/01deed576019060000018c1bd2352d.gif' ); 
  25.             img.src = src; 
  26.         } 
  27.     } 
  28. })(); 
  29.  
  30. proxyImage.setSrc( 'https://xxx.jpg' ); 

使用代理模式后,圖片本地對象負責往頁面中創建一個img標簽,并且提供一個對外的setSrc接口;

代理對象負責在圖片未加載完成之前,引入預加載的loading圖,負責了圖片預加載的功能

上述并沒有改變或者增加MyImage的接口,但是通過代理對象,實際上給系統添加了新的行為

并且上述代理模式可以發現,代理和本體接口的一致性,如果有一天不需要預加載,那么就不需要代理對象,可以選擇直接請求本體。其中關鍵是代理對象和本體都對外提供了 setSrc 方法

三、應用場景

現在的很多前端框架或者狀態管理框架都使用代理模式,用于監聽變量的變化

使用代理模式代理對象的訪問的方式,一般又被稱為攔截器,比如我們在項目中經常使用 Axios 的實例來進行 HTTP 的請求,使用攔截器 interceptor 可以提前對 請求前的數據 服務器返回的數據進行一些預處理

以及上述應用到的緩存代理和虛擬代理

參考文獻

https://juejin.cn/post/6844903555036364814#heading-2

https://juejin.cn/post/6992510837403418654#heading-7

 

https://sothx.com/2021/06/26/proxy/

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-11-09 08:51:13

模式命令面試

2021-11-10 07:47:49

組合模式場景

2021-11-03 14:10:28

工廠模式場景

2021-11-22 23:50:59

責任鏈模式場景

2021-11-11 16:37:05

模板模式方法

2021-09-16 07:52:18

算法應用場景

2021-08-16 08:33:26

git

2021-11-04 06:58:32

策略模式面試

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-28 07:12:09

測試路徑

2021-09-29 07:24:20

場景數據

2021-10-08 09:59:32

冒泡排序場景

2021-09-10 06:50:03

TypeScript裝飾器應用

2021-10-13 18:01:33

快速排序場景

2021-10-09 10:25:41

排序應用場景

2021-09-08 07:49:34

TypeScript 泛型場景

2021-05-31 10:35:34

TCPWebSocket協議

2021-06-01 08:25:06

Node.jsJavaScript運行

2021-10-18 07:51:39

回溯算法面試

2021-10-11 09:38:41

開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品爱久久久久久久 | 在线视频 亚洲 | 亚洲国产精品一区二区三区 | 在线观看www | 国产精品日韩欧美一区二区 | 淫片一级国产 | 在线欧美小视频 | 一区视频在线 | 亚洲综合精品 | 第一区在线观看免费国语入口 | 国产在线一区二区三区 | 精品亚洲一区二区三区 | 一级黄色影片在线观看 | 丝袜 亚洲 欧美 日韩 综合 | 伊人久久大香线 | 国精产品一区二区三区 | 欧美日韩在线一区 | 国产一区二区 | 久久99成人 | 视频1区2区| 久久精品亚洲欧美日韩久久 | 日韩欧美精品 | 视频二区国产 | 精品国产乱码久久久久久牛牛 | 国产一区视频在线 | 亚洲第一区国产精品 | 99精品欧美一区二区三区综合在线 | 亚洲国产成人久久综合一区,久久久国产99 | 2018天天干天天操 | 男女激情网站免费 | 日韩中文字幕视频 | 亚洲网在线 | www.99热这里只有精品 | 国产精品国产亚洲精品看不卡15 | 伊大人久久 | 久久精品 | 黄色av网站在线观看 | 中文天堂在线观看 | 日本欧美国产在线观看 | 久久精品男人的天堂 | 国产美女h视频 |