从0开始学Vue系列4--数据代理

120 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

我要一步一步往上爬~大家好,今天我们来一起学习一下数据代理这个概念。

一、数据代理

定义:一个对象去代理另一个对象属性的操作,包括读写操作

我们借助一段代码更好的去理解:

<script type="text/javascript" >
    let obj1 = {a:111}
    let obj2 = {b:222}

    Object.defineProperty(obj2,'a',{
        get(){
            return obj1.a
        },
        set(value){
            obj1.a = value
        }
    })
</script>

解释:对象obj1的a值为111,对象obj2的b值为222,我们使用对象的defineProperty操作对象obj2get方法里面定义返回对象obj1a值,也就是查看对象1的a值,set方法里定义设置obj1a为指定值,也就是可以操作另一个对象1的属性a值。

结果展示

图片14.png

可以看出,通过obj1obj2都可以去操作属性a,这就是数据代理的作用!

二、Vue的数据代理

定义:使用vm对象去代理data对象中属性的操作,这样做的好处是不用在模板中去写_data.属性值这样的表达式了,操作data中的属性就更加方便了。

实现原理解释

图片15.png

一切源自于我们编写的代码片段,我们创建了一个vm实例对象,Vue会为vm准备诸多属性,这里面就包括了_data属性,Object.defineProperty()方法会把data中对象的所有属性(这里指nameage)赋值给_data,此时vm身上是没有nameage的,它要通过vm._data才能访问到nameage

如果Vue没有数据代理,我们的代码就会变成下面这样,是不是很麻烦!

<div id="root">
    <h2>名字:{{_data.name}}</h2>
    <h2>年龄:{{_data.age}}</h2>
</div>

所以Vue的数据代理所做的事情就是,通过getter/setter方法,去读取/设置_data中的值给vm,这样就省去了复杂的代码,可以很简单的使用data中定义的属性了!