vue数据响应式原理知识点总结
vue2.0数据响应式原理
对象
Obect.defineproperty定义对象的属性mjm
defineproperty其实不是核心的为一个对象做数据双向绑定,而是去给对象做属性标签,设置一系列操作权限,只不过属性里的get和set实现了响应式
varob={ a:1, b:2 } //1-对象2-属性3-对于属性的一系列配置 Object.defineProperty(ob,'a',{//a对象则是ob的绝对私有属性,,默认都是true writable:false, enumerable:false, configurable:false }) ob.a=3 console.log(Object.getOwnPropertyDescriptor(ob,'a')) console.log(ob.a)//1
varob={ a:1, b:2 } //1-对象2-属性3-对于属性的一系列配置 /** *vue双向数据绑定 *给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法 */ Object.defineProperty(ob,'a',{//a对象则是ob的绝对私有属性,,默认都是true get:function(){ console.log('a-get') }, set:function(){ console.log('a-set') } }) ob.a=3 console.log(ob.a)
//正常用法,,,使用中转,不优雅 varob={ a:1, b:2 } //1-对象2-属性3-对于属性的一系列配置 /** *vue双向数据绑定 *给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法 */ var_value=ob.a//_value作为一个中转 Object.defineProperty(ob,'a',{//a对象则是ob的绝对私有属性,,默认都是true get:function(){ console.log('a-get') return_value; }, set:function(newValue){ console.log('a-set') _value=newValue; } }) ob.a=3 console.log(ob.a)//get方法必须return,否则返回undefined
defineProperty定义的get和set是对象的属性,那么数组怎么办?
做了个装饰者模式
/** *概述Object.create()方法创建一个拥有指定原型和若干个指定属性的对象。 *被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性。 *语法Object.create(proto,[propertiesObject]) */ //数组--做了个装饰者模式 vararraypro=Array.prototype; vararrob=Object.create(arraypro) vararr=['push','pop','shift'];//枚举这三个,vue中还有其他 arr.forEach((method,index)=>{ arrob[method]=function(){ varret=arraypro[method].apply(this,arguments); dep.notify(); } })
vue3.0数据响应式原理-Proxy
Proxy对象用于定义基本操作的自定义行为,用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(metaprogramming),即对编程语言进行编程。
和defineProperty类似,功能几乎一样,但是用法不同
为什么要是用Procy? 1、defineProperty只能监听某个属性,不能对全对象监听 2、所以可以省去forin提升效率 3、可以监听数组,不用再去单独对数组做特异性操作
改造的observer: vue.prototype.observer=function(obj){//注册get/set监听 varself=this; this.$data=newProxy(this.$data,{ get:function(target,key,receiver){ returntarget[key] }, set:function(target,key,value,receiver){ //returnReflect.set(target,key,value); //returntarget[key]=value target[key]=value; self.render(); } }) }
Proxy用途--校验类型--真正的私有变量
Diff算法和virtuadoml
//1-对象2-属性3-对于属性的一系列配置
以上就是小编给大家整理的全部相关知识点,感谢大家的学习如果有任何疑问可以联系毛票票小编。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。