Proxy对象(超详细)

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(),该方法设置一个指定的对象的原型

0

  • target,被拦截目标对象。
  • prototype,对象新原型或为null。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
v3 proxy对象是一个用于处理对象的代理对象,它可以用于实现数据绑定、拦截、代理等功能。在JavaScript中,我们可以使用Reflect对象Proxy()方法来创建v3 proxy对象。 要给v3 proxy对象赋值,我们需要使用一个叫做handler的对象来定义代理的行为。handler对象可以包含一组属性,用于定制代理的行为。其中,最重要的两个属性是get和set。 当我们给v3 proxy对象赋值时,会触发set方法,我们可以在set方法中定义自己的逻辑来处理赋值操作。set方法接受三个参数:target(被代理的目标对象)、property(要赋值的属性)和value(要赋予的值)。我们可以在set方法中通过target[property] = value来实现赋值操作。 下面是一个示例代码,展示了如何给v3 proxy对象赋值: ``` const target = { name: 'John', age: 25 }; const handler = { set(target, property, value) { console.log(`Setting ${property} to ${value}`); target[property] = value; // 赋值操作 return true; } }; const proxy = new Proxy(target, handler); proxy.name = 'Jane'; // 设置name属性为Jane console.log(proxy.name); // 打印Jane ``` 在上述代码中,我们创建了一个target对象,其中包含name和age属性。然后,我们定义了一个handler对象,并在set方法中打印了要设置的属性和值。最后,我们使用Proxy()方法创建了一个v3 proxy对象proxy,并将handler对象作为参数传入。 当我们通过proxy对象给name属性赋值时,会触发handler对象的set方法。set方法会打印设置的属性和值,并修改target对象的属性值为所赋予的新值。 最后,我们通过打印proxy对象的name属性,可以看到它已经被成功赋值为Jane。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rinba_murphy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值