语法
js
new Proxy(target, handler)
参数
描述
可以使用 Proxy() 构造函数来创建一个新的 Proxy 对象。构造函数接收两个必须的参数:
target是要创建代理的对象handler是定义了代理的自定义行为的对象
一个空的处理器(handler)将会创建一个与被代理对象行为几乎完全相同的代理对象。通过在 handler 对象上定义一组函数,你可以自定义被代理对象的一些特定行为。例如,通过定义 get() 你就可以自定义被代理对象的属性访问器。
处理器函数
本节列出了所有你可以自定义的处理函数。处理器函数有时候也被称为劫持(trap),这是由于它们会对底层被代理对象的调用进行劫持。
handler.apply()-
函数调用劫持。
handler.construct()-
new运算符劫持。 handler.defineProperty()-
Object.defineProperty调用劫持。 handler.deleteProperty()-
delete运算符劫持。 handler.get()-
获取属性值劫持。
handler.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: "原始值",
proxied: "原始值",
};
const handler = {
get(target, prop, receiver) {
if (prop === "proxied") {
return "替换值";
}
return Reflect.get(...arguments);
},
};
const proxy = new Proxy(target, handler);
console.log(proxy.notProxied); // "原始值"
console.log(proxy.proxied); // "替换值"
规范
| 规范 |
|---|
| ECMAScript® 2027 Language Specification> # sec-proxy-constructor> |