Proxy() 构造函数

Proxy() 构造函数创建 Proxy 对象。

语法

js
new Proxy(target, handler)

注意:Proxy() 只能使用 new 来构造。尝试在没有 new 的情况下调用它会抛出一个 TypeError

参数

target

要使用 Proxy 包装的目标对象。它可以是任何类型的对象,包括原生数组、函数,甚至另一个代理。

handler

一个对象,其属性是函数,定义了在对代理执行操作时代理的行为。

描述

使用 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.getOwnPropertyNamesObject.getOwnPropertySymbols 的陷阱。

handler.preventExtensions()

用于 Object.preventExtensions 的陷阱。

handler.set()

设置属性值的陷阱。

handler.setPrototypeOf()

用于 Object.setPrototypeOf 的陷阱。

示例

选择性地代理属性访问器

在此示例中,目标具有两个属性,notProxiedproxied。我们定义了一个处理器,它为 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 的浏览器中加载。

另请参阅