Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)Proxy - JavaScript | MDN
参数:
- target:被 Proxy 代理虚拟化的对象。它常被作为代理的存储后端。根据目标验证关于对象不可扩展性或不可配置属性的不变量(保持不变的语义)。
- traps:提供属性访问的方法。这类似于操作系统中捕获器的概念。
- handler:包含捕捉器(trap)的占位符对象,可译为处理器对象。
语法:
Vue3中使用Proxy的场景——Vue3的响应式实现原理
- 通过Proxy(代理): 拦截对象中任意属性的变化,增、删、改、查。
- 通过Reflect(反射): 对源对象(被代理的对象)的属性进行操作。
handler.apply()
用于拦截函数的调用。apply 方法可以返回任何值。
- target,目标对象(函数)。
- thisArg,被调用时的上下文对象。
- argumentsList,被调用时的参数数组。
handler.construct()
用于拦截 new 操作符。为了使 new 操作符在生成的 Proxy 对象上生效,用于初始化代理的目标对象自身必须具有 [[Construct]] 内部方法(即 new target 必须是有效的)。construct 方法必须返回一个对象。
- target,目标对象。
- argumentsList,constructor 的参数列表。
- newTarget,最初被调用的构造函数,就上面的例子而言是 p。
handler.defineProperty()
用于拦截对象的Object.defineProperty() ,该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。defineProperty 方法必须以一个 Boolean 返回,表示定义该属性的操作成功与否。
- target,目标对象。
- property,待检索其描述的属性名。
- descriptor,待定义或修改的属性的描述符。
handler.deleteProperty()
用于拦截对对象属性的 delete 操作。deleteProperty 必须返回一个 Boolean 类型的值,表示了该属性是否被成功删除。
deleteProperty 方法将会接受以下参数。this 被绑定在 handler 上。
- target,目标对象。
- property,待删除的属性名。
handler.get()
用于拦截对象的读取属性操作。get 方法可以返回任何值。
- target,目标对象。
- property,被获取的属性名。
- receiver,Proxy 或者继承 Proxy 的对象
handler.getOwnPropertyDescriptor()
该方法是 Object.getOwnPropertyDescriptor() 的钩子。Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。
- obj,需要查找的目标对象
- prop,目标对象内属性名称
Object.getOwnPropertyDescriptors()
用来获取一个对象的所有自身属性的描述符。返回所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
- obj,任意对象
handler.getPrototypeOf()
是一个代理(Proxy)方法,当读取代理对象的原型时,该方法就会被调用。getPrototypeOf 方法的返回值必须是一个对象或者 null。
当 getPrototypeOf 方法被调用时,this 指向的是它所属的处理器对象。
- target,被代理的目标对象。
handler.has()
针对 in 操作符的代理方法。
- target,目标对象。
- prop,需要检查是否存在的属性。
handler.isExtensible()
用于拦截对对象的 Object.isExtensible()。isExtensible方法必须返回一个 Boolean 值或可转换成 Boolean 的值
下列参数将会被传递给 isExtensible方法。this 绑定在 handler 对象上。
- target,目标对象。
handler.ownKeys()
用于拦截 Reflect.ownKeys(),该方法返回一个由目标对象自身的属性键组成的数组。
- target,目标对象。
handler.preventExtensions()
用于设置对Object.preventExtensions()的拦截,该方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
- target,所要拦截的目标对象。
handler.set()
设置属性值操作的捕获器。set() 方法应当返回一个布尔值。
以下是传递给 set() 方法的参数。this 绑定在 handler 对象上。
- target,目标对象。
- property,将被设置的属性名或 Symbol。
- value,新属性值。
- receiver,最初被调用的对象。通常是 proxy 本身,但 handler 的 set 方法也有可能在原型链上,或以其他方式被间接地调用(因此不一定是 proxy 本身)。
handler.setPrototypeOf()
用来拦截 Object.setPrototypeOf(),该方法设置一个指定的对象的原型
- target,被拦截目标对象。
- prototype,对象新原型或为null。