vue3.0 使用proxy代替object.defineproperty()实现数据响应

Proxy是什么?

MDN对Proxy的定义是  Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(属性查找,赋值,枚举,遍历等)

官方的介绍十分抽象,通俗的来讲,Proxy所做的事情就是,为要访问的目标对象设置一层拦截,可以对外界的操作(如属性查找,赋值,枚举等)进行过滤和改写,返回我们想要返回的数据结构,这样我们不用操作对象本身,通过操作对象的代理对象,来达到预期目的。举个例子

let obj={
    a:1
}
let proxyObj=new Proxy(obj,{
    get(target,prop){
        return prop in target? target[prop]:'this property is undefined'
    },
    set(target,prop,value){
        target[prop]=888;
    }
})

console.log(proxyObj.a)//1
console.log(proxyObj.b)//this property is undefined

console.log(obj.a)//1
console.log(obj.b)//undefined

proxyObj.a=999;
console.log(proxyObj.a)//888

这个例子就说明了proxy的基本用法,首先创建一个自定义的obj对象,然后实例化一个Proxy对象,在第二个参数里定义了setter和getter,那么通过proxyobj访问对象中原来已经存在的属性时,返回它的值,访问obj中不存在的值,按照我们预设的一样,返回 "this property is undefined",而我们通过访问原对象 obj.a 返回1 ,访问obj.b这个对象中不存在的值,返回undefined,说明要想代理起作用,要通过访问proxy对象

语法

es6为我们提供的proxy的语法特别简单

let proxyobj=new Proxy(target,handler)

proxy构造器接受两个参数,第一个参数target是要用Proxy包装的目标对象(可以是对象,数组,函数),第二个参数handler是一个对象,可以为{}但不能为null,为空时表示对proxyObj的操作就是对obj的操作。在handler支持的拦截操作有13中,参见MDNhttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Vue中使用proxy和object.defineproperty()进行数据双向绑定的区别

1,Object.defineproperty()操作的是对象的属性,需要对属性进行深度的遍历和监听,并且无法动态反应对象属性的添加或删除,以及数组下标的变化,需要使用$set手动的触发更新

2,proxy是拦截整个对象,拓展对象的能力,因此对对象的任何操作都会走到处理逻辑

 

 

 


版权声明:本文为zhm0303原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。