Proxy() 构造器
Proxy()
构造器用来创建 Proxy
对象。语法
new Proxy(target, handler)
参数
target
-
Proxy
会对 target 对象进行包装。它可以是任何类型的对象,包括内置的数组,函数甚至是另一个代理对象。 handler
-
它是一个对象,它的属性提供了某些操作发生时所对应的处理函数。
描述
我们可以使用 Proxy()
构造器来创建一个新的 Proxy
对象。构造器接收两个主要参数:
target
被代理的对象handler
被代理对象上的自定义行为
一个空的 handler
参数将会创建一个与被代理对象行为几乎完全相同的代理对象。通过在 handler
对象上定义一组处理函数,你可以自定义被代理对象的一些特定行为。例如,通过定义 get()
你就可以自定义被代理对象的属性访问器。
处理函数
本节列出了所有你可以自定义的处理函数。处理函数有时候也被成为“劫持”(traps),这是由于它们会对底层被代理对象的调用进行劫持。
handler.apply()
-
函数调用劫持。
handler.construct()
-
new
操作符劫持 handler.defineProperty()
handler.deleteProperty()
-
delete
操作符劫持。 handler.get()
-
获取属性值劫持。
handler.getOwnPropertyDescriptor()
handler.getPrototypeOf()
handler.has()
-
in
操作符劫持。 handler.isExtensible()
-
Object.isExtensible
调用劫持。 handler.ownKeys()
-
Object.getOwnPropertyNames
和Object.getOwnPropertySymbols
调用劫持。 handler.preventExtensions()
handler.set()
-
设置属性值劫持。
handler.setPrototypeOf()
示例
选择性代理属性访问器
本例中,被代理对象有两个属性: notProxied
和 proxied
。我们定义了一个处理函数,它为 proxied
属性返回一个不同的值,而其他属性返回原值。
js
const target = {
notProxied: "original value",
proxied: "original value",
};
const handler = {
get: function (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"
规范
Specification |
---|
ECMAScript Language Specification # sec-proxy-constructor |
浏览器兼容性
BCD tables only load in the browser