语法
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 |
浏览器兼容性
加载中…