在 JavaScript 中,我们通常使用对象来封装数据和行为,并通过访问对象的属性来操作数据和执行行为。但是,当我们需要对属性访问和对象操作进行更细粒度的控制时,原生的对象机制可能会变得不够灵活。
例如,我们可能想要限制对象属性的读取和设置,或者记录对象操作的日志,这时候 Proxy 对象就可以派上用场了。

JavaScript 中的 Proxy 对象是 ES6(ECMAScript 2015)引入的一个新特性,它允许你创建一个代理对象,用于在目标对象的基础上提供一个额外的抽象层。
该代理对象允许你拦截和定义一些默认的操作,例如属性访问、函数调用、对象枚举等。 Proxy 对象与 Object.defineProperty() 方法和 getter 和 setter 方法类似,但是它提供了更多的功能和更好的可定制性。

创建 Proxy 对象的语法如下:

1
const proxy = new Proxy(target, handler);

其中,target表示要创建代理对象的目标对象,handler是一个对象,它定义了要拦截的操作。handler对象可以包含一组特殊的方法,这些方法允许你拦截并定义默认的操作,例如get()、set()、apply()等等。

以下是一些可用的方法:

  • get(target, prop, receiver):拦截对象属性的读取操作。

  • set(target, prop, value, receiver):拦截对象属性的设置操作。

  • has(target, prop):拦截对象in运算符的操作。

  • apply(target, thisArg, argumentsList):拦截函数的调用操作。

  • construct(target, argumentsList, newTarget):拦截new操作符的操作。

  • getOwnPropertyDescriptor(target, prop):拦截Object.getOwnPropertyDescriptor()的操作。

  • defineProperty(target, prop, descriptor):拦截Object.defineProperty()的操作。

  • deleteProperty(target, prop):拦截对象属性的删除操作。

  • getPrototypeOf(target):拦截Object.getPrototypeOf()的操作。

  • setPrototypeOf(target, prototype):拦截Object.setPrototypeOf()的操作。

  • isExtensible(target):拦截Object.isExtensible()的操作。

  • preventExtensions(target):拦截Object.preventExtensions()的操作。

  • enumerate(target):拦截for…in循环的操作。

  • ownKeys(target):拦截Object.getOwnPropertyNames()和Object.getOwnPropertySymbols()的操作。
  • 每个方法函数都会被传递一些参数,包括目标对象、属性名、值等等。你可以在函数中处理这些参数,然后返回你想要的结果。