简单理解proxy

本文介绍了Proxy在Vue3中的重要角色,作为替代Vue2中Object.defineProperty的数据响应化方案。Proxy能够更全面地拦截对象的操作,包括get、set、has等,提供更灵活的数据绑定,并且能够监听数组变化,解决了Vue2中数据监听的局限性。
摘要由CSDN通过智能技术生成

什么是Proxy?它有什么作用?

Proxy的MDN
据阮一峰文章介绍:Proxy可以理解成,在目标对象之前架设一层 “拦截”,当外界对该对象访问的时候,都必须经过这层拦截,而Proxy就充当了这种机制,类似于代理的含义,它可以对外界访问对象之前进行过滤和改写该对象。

在vue2.+中

我们知道在Vue2.xx中使用 Object.defineProperty()方法对该对象通过 递归+遍历的方式来实现对数据的监控的。但是当我们使用数组的方法或改变数组的下标是不能重新触发 Object.defineProperty中的set()方法的,因此就做不到实时响应了。所以使用Object.defineProperty 存在如下缺点`:

1.监听数组的方法不能触发Object.defineProperty方法中的set操作(如果要监听的到话,需要重新编写数组的方法)。
2.必须遍历每个对象的每个属性,如果对象嵌套很深的话,需要使用递归调用

因此vue3.xx中之后就改用Proxy来更好的解决如上面的问题。在学习使用Proxy实现数据双向绑定之前,我们还是一步步来,先学习了Proxy基本知识点。

Proxy的基本语法

const obj = new Proxy(target, handler);

参数说明如下:

target: 被代理对象。

handler: 是一个对象,声明了代理target的一些操作。

但是当外界每次对obj进行操作时,就会执行handler对象上的一些方法。handler中常用的对象方法如下:

  1. get(target, propKey, receiver)
  2. set(target, propKey, value, receiver)
  3. has(target, propKey)

如上是Proxy中handler 对象的方法,其实它和Reflect里面的方法类似的

const target = {
   
  name: 'artiely'
};

const handler = {
   
  get: function(target, key) {
   
    console.log(`${
     key} 被读取`);
    return target[key];
  },
  set: function(target, key, value) {
   
    console.log(`${
     key} 被设置为 ${
     value}`);
    target
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeScript 中的代理(Proxy)是一种机制,它允许你拦截并自定义对象的操作。通过使用代理,你可以在对象的属性访问、赋值、函数调用等操作之前或之后执行自定义逻辑。这为你提供了更大的灵活性和控制力。 要创建一个代理对象,你可以使用 `Proxy` 构造函数。它接受两个参数:目标对象和一个处理程序对象(也称为代理处理器)。代理处理程序是一个包含各种钩子方法的对象,用于拦截和处理不同的操作。 下面是一个简单的示例,演示如何使用 TypeScript 创建一个代理对象: ```typescript const target = { name: "John", age: 30 }; const handler = { get: function(target, prop) { console.log(`Getting property ${prop}`); return target[prop]; }, set: function(target, prop, value) { console.log(`Setting property ${prop} to ${value}`); target[prop] = value; } }; const proxy = new Proxy(target, handler); console.log(proxy.name); // 输出:Getting property name,John proxy.age = 35; // 输出:Setting property age to 35 console.log(proxy.age); // 输出:Getting property age,35 ``` 在上面的示例中,我们创建了一个名为 `target` 的普通对象,它具有 `name` 和 `age` 两个属性。然后,我们定义了一个代理处理程序 `handler`,其中包含了 `get` 和 `set` 两个钩子方法。在这些方法中,我们可以自定义对象的属性访问和赋值行为。最后,我们使用 `new Proxy` 创建了一个代理对象 `proxy`,并对其进行了一些操作。 注意:由于 TypeScript 是 JavaScript 的超集,上述示例中的代码也适用于 JavaScript 环境。 希望这个简单的示例能够帮助你理解 TypeScript 中的代理概念和用法。如果你有更多问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值