語法
js
new Proxy(target, handler)
引數
描述
使用 Proxy() 建構函式建立一個新的 Proxy 物件。此建構函式接受兩個必需引數:
target是您要為其建立代理的物件。handler是定義代理自定義行為的物件。
一個空的 handler 將建立一個在幾乎所有方面都與目標物件完全相同的代理。透過在 handler 物件上定義一組特定的函式,您可以自定義代理行為的特定方面。例如,透過定義 get(),您可以提供目標物件 屬性訪問器 的自定義版本。
Handler 函式
本節列出了您可以定義的所有 handler 函式。Handler 函式有時被稱為 *trap*,因為它們會攔截對底層目標物件的呼叫。
handler.apply()-
攔截函式呼叫的 trap。
handler.construct()-
攔截
new運算子的 trap。 handler.defineProperty()-
攔截
Object.defineProperty的 trap。 handler.deleteProperty()-
攔截
delete運算子的 trap。 handler.get()-
攔截獲取屬性值的 trap。
handler.getOwnPropertyDescriptor()-
攔截
Object.getOwnPropertyDescriptor的 trap。 handler.getPrototypeOf()-
攔截
Object.getPrototypeOf的 trap。 handler.has()-
攔截
in運算子的 trap。 handler.isExtensible()-
攔截
Object.isExtensible的 trap。 handler.ownKeys()-
攔截
Object.getOwnPropertyNames和Object.getOwnPropertySymbols的 trap。 handler.preventExtensions()-
攔截
Object.preventExtensions的 trap。 handler.set()-
攔截設定屬性值的 trap。
handler.setPrototypeOf()-
攔截
Object.setPrototypeOf的 trap。
示例
選擇性代理屬性訪問器
在此示例中,目標物件有兩個屬性:notProxied 和 proxied。我們定義了一個 handler,它為 proxied 返回不同的值,並允許其他所有訪問穿透到目標物件。
js
const target = {
notProxied: "original value",
proxied: "original value",
};
const handler = {
get(target, prop, receiver) {
if (prop === "proxied") {
return "replaced value";
}
return Reflect.get(...arguments);
},
};
const proxy = new Proxy(target, handler);
console.log(proxy.notProxied); // "original value"
console.log(proxy.proxied); // "replaced value"
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-proxy-constructor |
瀏覽器相容性
載入中…