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()
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.getOwnPropertyNamesObject.getOwnPropertySymbols调用劫持。
handler.preventExtensions()
Object.preventExtensions调用劫持。
handler.set()
设置属性值劫持。
handler.setPrototypeOf()
Object.setPrototypeOf调用劫持。

示例

选择性代理属性访问器

本例中,被代理对象有两个属性: notProxied  和 proxied 。我们定义了一个处理函数,它为 proxied 属性返回一个不同的值,而其他属性返回原值。

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"

标准

浏览器兼容性

BCD tables only load in the browser

相关链接