JavaScript代理模式,怎麼實現物件的動態代理?
在JavaScript中,代理模式是一種常見的設計模式,它允許我們在不改變物件本身的情況下,透過代理物件來控制物件的訪問。代理模式可以用於實現快取、許可權控制、遠端呼叫等功能。
代理模式的定義
代理模式是指在訪問物件時引入一定程度的間接性,因為這種間接性可以附加多種用途,所以代理模式是一種非常常用的設計模式。
代理模式的實現
在JavaScript中,我們可以使用Proxy物件來實現代理模式。Proxy物件是ES6中新增的一個物件,它可以用來代理另一個物件,攔截並改變該物件的預設行為。
下面是一個簡單的例子,我們透過代理物件來控制對原始物件的訪問:
let target = {
name: 'Tom',
age: 18
};
let proxy = new Proxy(target, {
get(target, key) {
console.log(`get ${key}`);
return target[key];
},
set(target, key, value) {
console.log(`set ${key}=${value}`);
target[key] = value;
}
});
proxy.name; // 輸出:get name
proxy.age = 20; // 輸出:set age=20
在上面的例子中,我們建立了一個原始物件target,然後透過Proxy物件建立了一個代理物件proxy。代理物件proxy攔截了對原始物件target的訪問,並輸出了相應的日誌資訊。
代理模式的應用
代理模式在實際開發中有很多應用場景,下面介紹其中的兩個:
快取代理
快取代理是指在訪問某個物件時,如果該物件已經被訪問過,那麼直接返回快取中的資料,否則執行原始的訪問操作,並將結果快取起來。
下面是一個簡單的例子,我們透過代理物件來實現快取代理:
function createProxy(fn) {
let cache = new Map();
return new Proxy(fn, {
apply(target, thisArg, args) {
let key = args.join(',');
if (cache.has(key)) {
console.log(`get result from cache: ${cache.get(key)}`);
return cache.get(key);
} else {
let result = target.apply(thisArg, args);
cache.set(key, result);
console.log(`set result to cache: ${result}`);
return result;
}
}
});
}
function add(a, b) {
return a + b;
}
let proxy = createProxy(add);
proxy(1, 2); // 輸出:set result to cache: 3
proxy(1, 2); // 輸出:get result from cache: 3
在上面的例子中,我們透過createProxy函式建立了一個代理物件proxy,該代理物件攔截了對add函式的呼叫,並實現了快取代理的功能。
許可權控制代理
許可權控制代理是指在訪問某個物件時,如果當前使用者沒有許可權訪問該物件,那麼直接返回錯誤資訊,否則執行原始的訪問操作。
下面是一個簡單的例子,我們透過代理物件來實現許可權控制代理:
let target = {
name: 'Tom',
age: 18
};
let proxy = new Proxy(target, {
get(target, key) {
if (key === 'age') {
console.log(`access denied: ${key}`);
return undefined;
} else {
console.log(`get ${key}`);
return target[key];
}
}
});
proxy.name; // 輸出:get name
proxy.age; // 輸出:access denied: age
在上面的例子中,我們建立了一個原始物件target,然後透過Proxy物件建立了一個代理物件proxy。代理物件proxy攔截了對原始物件target的訪問,並實現了許可權控制的功能。
代理模式 是一種非常常用的設計模式,它可以用於實現快取、許可權控制、遠端呼叫等功能。在JavaScript中,我們可以使用Proxy物件來實現代理模式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70033972/viewspace-2987394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 代理模式 - 動態代理模式
- Java代理設計模式(Proxy)的四種具體實現:靜態代理和動態代理Java設計模式
- 設計模式學習筆記(七)代理模式以及動態代理的實現設計模式筆記
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- 動態代理模式模式
- Android 動態代理以及利用動態代理實現 ServiceHookAndroidHook
- 【JAVA】代理模式之Java動態代理Java模式
- Java設計模式-之代理模式(動態代理)Java設計模式
- 【菜鳥學Java】12:代理模式——靜態代理怎麼玩?Java模式
- 【設計模式】-代理模式及動態代理詳解設計模式
- 設計模式總結——代理模式以及java的動態代理設計模式Java
- 求助,動態代理模式的困惑模式
- JDK動態代理物件與被代理物件地址值問題JDK物件
- 設計模式:動態代理設計模式
- 反射-動態代理的概述和實現反射
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- 面試常問的設計模式之代理模式的詳細解析!分析說明靜態代理模式和動態代理模式面試設計模式
- 為什麼要用代理和動態代理
- 代理模式-靜態代理解讀模式
- 靜態代理和動態代理
- JAVA 靜態代理 & 動態代理Java
- SAP ABAP和Java的動態代理實現Java
- 細說JDK動態代理的實現原理JDK
- Java設計模式學習06——靜態代理與動態代理Java設計模式
- [動態代理三部曲:下] - 從動態代理,看Retrofit的原始碼實現原始碼
- 【乾貨】JDK動態代理的實現原理以及如何手寫一個JDK動態代理JDK
- 代理模式-訪問物件的代理而非其本身模式物件
- Java 8 動態代理的新技巧(1):為什麼使用動態代理?Java
- 純手寫實現JDK動態代理JDK
- CGLib動態代理原理及實現CGLib
- RPC核心實現原理-動態代理RPC
- Java中的靜態代理和動態代理Java
- 靜態代理、動態代理與Mybatis的理解MyBatis
- java靜態代理和動態代理Java
- JavaScript設計模式與實踐--代理模式JavaScript設計模式
- go如何實現類似java的動態代理GoJava
- 【菜鳥學Java】13:代理模式——動態代理這樣玩!Java模式
- 動態代理