Proxy() 构造函数

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

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

语法

js
new Proxy(target, handler)

注意: Proxy() 只能通过 new 来构造。尝试不带 new 调用它会抛出 TypeError

参数

目标

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

handler

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

描述

使用 Proxy() 构造函数创建一个新的 Proxy 对象。此构造函数接受两个必需参数:

  • target 是您要为其创建代理的对象。
  • handler 是定义代理自定义行为的对象。

一个空的 handler 将创建一个在几乎所有方面都与目标对象完全相同的代理。通过在 handler 对象上定义一组特定的函数,您可以自定义代理行为的特定方面。例如,通过定义 get(),您可以提供目标对象 属性访问器 的自定义版本。

Handler 函数

本节列出了您可以定义的所有 handler 函数。Handler 函数有时被称为 *trap*,因为它们会拦截对底层目标对象的调用。

handler.apply()

拦截函数调用的 trap。

handler.construct()

拦截 new 运算符的 trap。

handler.defineProperty()

拦截 Object.defineProperty 的 trap。

handler.deleteProperty()

拦截 delete 运算符的 trap。

handler.get()

拦截获取属性值的 trap。

handler.getOwnPropertyDescriptor()

拦截 Object.getOwnPropertyDescriptor 的 trap。

handler.getPrototypeOf()

拦截 Object.getPrototypeOf 的 trap。

handler.has()

拦截 in 运算符的 trap。

handler.isExtensible()

拦截 Object.isExtensible 的 trap。

handler.ownKeys()

拦截 Object.getOwnPropertyNamesObject.getOwnPropertySymbols 的 trap。

handler.preventExtensions()

拦截 Object.preventExtensions 的 trap。

handler.set()

拦截设置属性值的 trap。

handler.setPrototypeOf()

拦截 Object.setPrototypeOf 的 trap。

示例

选择性代理属性访问器

在此示例中,目标对象有两个属性:notProxiedproxied。我们定义了一个 handler,它为 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® 2026 语言规范
# sec-proxy-constructor

浏览器兼容性

另见