Proxy() 构造函数
Proxy()
构造函数创建 Proxy
对象。
语法
参数
描述
使用 Proxy()
构造函数创建一个新的 Proxy
对象。此构造函数接受两个必填参数
target
是您想要为其创建代理的对象handler
是定义代理自定义行为的对象。
空处理器将创建一个在几乎所有方面都与目标完全相同的代理。通过在 handler
对象上定义任何一组函数,您可以自定义代理行为的特定方面。例如,通过定义 get()
,您可以提供目标 属性访问器 的自定义版本。
处理器函数
本节列出了您可以定义的所有处理器函数。处理器函数有时也称为“陷阱”,因为它们会捕获对底层目标对象的调用。
handler.apply()
-
函数调用的陷阱。
handler.construct()
-
用于
new
运算符的陷阱。 handler.defineProperty()
-
用于
Object.defineProperty
的陷阱。 handler.deleteProperty()
-
用于
delete
运算符的陷阱。 handler.get()
-
获取属性值的陷阱。
handler.getOwnPropertyDescriptor()
-
用于
Object.getOwnPropertyDescriptor
的陷阱。 handler.getPrototypeOf()
-
用于
Object.getPrototypeOf
的陷阱。 handler.has()
-
用于
in
运算符的陷阱。 handler.isExtensible()
-
用于
Object.isExtensible
的陷阱。 handler.ownKeys()
-
用于
Object.getOwnPropertyNames
和Object.getOwnPropertySymbols
的陷阱。 handler.preventExtensions()
-
用于
Object.preventExtensions
的陷阱。 handler.set()
-
设置属性值的陷阱。
handler.setPrototypeOf()
-
用于
Object.setPrototypeOf
的陷阱。
示例
选择性地代理属性访问器
在此示例中,目标具有两个属性,notProxied
和 proxied
。我们定义了一个处理器,它为 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 语言规范 # sec-proxy-constructor |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。