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调用劫持。

示例

选择性代理属性访问器

本例中,被代理对象有两个属性: notProxiedproxied 。我们定义了一个处理函数,它为 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

相关链接