• 【Vue】defineProperty与数据代理


    0 前言

    defineProperty在Vue中有着广泛的应用,其设计及使用思想也很值得学习与借鉴。在Vue2中,用defineProperty实现了数据代理。
    另外,应当注意,Vue3中改用proxy实现数据代理,这与Vue2不同。

    1 defineProperty

    1.1 是什么

    Object.defineProperty,defineProperty是js对象的方法。

    1.2 目标需求

    1. person有name和sex,要给person添加age属性。
    2. 读取person.age,就获得number值

      number改变,则person.age改变

    3. 修改person.age,同时修改number值

      person.age改变,则number改变

    1.3 代码实现

    let number = 18
    let person = {
    	name:'张三',
    	sex:'男',
    }
    
    Object.defineProperty(person,'age',{
    	enumerable:true, //控制属性是否可以枚举,默认值是false
    	writable:true, //控制属性是否可以被修改,默认值是false
    	configurable:true //控制属性是否可以被删除,默认值是false
    	
    	//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    	get(){
    		console.log('有人读取age属性了')
    		return number
    	},
    	//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
    	set(value){
    		console.log('有人修改了age属性,且值是',value)
    		number = value
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1.4 说明

    与直接使用下文代码不同,用defineProperty可以实现更加复杂的属性需求(枚举、修改、删除)。另外,下文代码也只能实现对象创建时的赋值,number与age无法数据绑定,无法再次相互改变。

    let person = {
    	name:'张三',
    	sex:'男',
    	age: number
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2 数据代理

    2.1 是什么

    两个对象,一个是obj1,另一个是obj2
    读obj2.x,则读到obj1.x。即:obj1.x改变,则obj2.x改变
    改obj2.x,则改了obj1.x。即:obj2.x改变,则obj1.x改变
    obj2,代理了obj1

    2.2 示意代码

    let obj1 = {x:100}
    let obj2 = {y:200}
    
    Object.defineProperty(obj2,'x',{
    	get(){
    		return obj1.x
    	},
    	set(value){
    		obj1.x = value
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3 Vue中的数据代理

    需要搞清楚两个问题,是什么,怎么做。

    2.3.1 是什么

    MVVM中,M(Model,数据)、V(View 视图)这两者中的数据要实现数据双向绑定。
    怎么实现他们呢?就是用VM(ViewModel)来实现,而这件事,就是Vue在做的事情。

    2.3.2 怎么做

    我们来看目标代码

    const vm = new Vue({
    			el:'#root',
    			data:{
    				name:'尚硅谷',
    				address:'宏福科技园'
    			}
    		})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Vue(Vue2,下略)中:

    1. 先通过Object.defineProperty(),把data对象中的属性,添加到vm上。
    2. 在添加时,会创建好getter/setter
    3. 通过getter/setter,就能实现data中属性的数据代理

    3 其他

    以上仅是对课程重点的笔记整理,但不代表课程内容的全部。
    其实只要理解了Object.defineProperty,那么数据代理的原理就不是那么复杂了。
    但是数据代理、双向绑定又绝不仅仅只有defineProperty
    输出vm对象,展开详细查看里面的属性,还有非常多细节的知识。
    而关于getter、setter,也不仅仅是个简单的定义,“读取时”、“修改时”这两个词,就有一些知识点,并且也与vm对象的详细属性有关,很有意思。
    如果只是简单了解理解,那么本文内容已经足够,如果有兴趣学习更细节的内容,建议二倍速跳着看一下这三节课。
    更多数据双向绑定有关的信息,有机会再补充更新。

    4 参考

    尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通

    5 扩展阅读

    【Vue】Vue2,Vue3 学习笔记
    【Vue】初识Composition Api
    【Vue】Mixin相关问题解析
    【Vue】defineProperty与数据代理

  • 相关阅读:
    【口罩识别】基于matlab GUI RGB滤波+YCbCr+肤色标定口罩识别【含Matlab源码 1895期】
    如何在本地安装多个nodejs版本,方便前端开发
    COS对象存储
    关于构造方法
    Splunk UBA 数据导入中可以接受的告警
    如何用python连接Linux服务器
    谷歌api站长批量翻译工具
    5个优质免费自然语言处理学习资源 | 语言技术导航
    网络安全(补充)
    win10设置透明任务栏
  • 原文地址:https://blog.csdn.net/RogerQianpeng/article/details/124912792