摘自杰瑞 · 赫尔曼的《你好,多莉》歌曲: 你未看此花时,此花与汝心同归于寂。你来看此花时,则此花颜色一时明白起来。便知此花不在你的心外。——王阳明

Vue中数据代理

内容目录

Vue中数据代理

1.什么是数据代理

概念: 通过一个对象代理对另一个对象中属性的操作。一般包含(读/写)。

可通过Object.defineProperty()实现。

Object.defineProperty()是js提供的一个方法,该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

语法: Object.defineProperty(obj,prop,descriptor)

参数:

obj(必传)

要定义属性的对象。也就是我们的目标对象,即我们要在哪个对象上进行属性的定义或修改。

prop(必传)

要定义或修改属性的名称。

descriptor(必传)

要定义或修改的属性描述符。可以这么理解,该参数是一个对象,我们可以通过这个对象的一些属性去定义目标属性的特性。

示例:通过person中.age修改number。通过修改number设置person.age的值。

let number = 18
let person ={
  name:'张三'
  sex:'男',
}

Object.defineProperty(person,age,{
    //value:18,
    //enumerable:true,  //控制属性是否可以枚举
    //writable:true,    //控制属性是否可以被修改
    //configurable:true //控制属性是否可以被删除

    //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    get(){
      console.log('读取age属性')
      return number;
    }

    //当有人修改oerson的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
    set(value){
    console.log('修改age属性,值为:',value)
    number = value
  }
})

2.Vue中实现

在一个vue文件中:

const vm = new Vue({
    el:'#root',
    data:{
        name:'前端',
        frame:'Vue'
    }
})

其中,vm是一个Vue实例。Vue中有data属性。

在控制台中可以看到:

其中的name,和frame都需要通过getter获取对应的data数据。

_data也就是data数据在vm实例中的值。并且通过数据劫持 实现响应式。

下图为数据代理图示:

data ==>vm._data 收集数据。

vm._data ==> vm中name,address。数据代理。通过Object.defineProperty()实现。

3.总结

1.Vue中的数据代理:

​ 通过vm对象来代理data对象中的属性的操作(读/写)

2.Vue中数据代理的好处。

​ 更加方便的操作data中的数据。否知只能每一个data属性调用时都得为:{{ _data.name }}

3.基本原理:

a.通过Object.defineProperty()把data对象中所有属性添加到vm上。

b.为每一个添加到vm上的属性,都指定一个getter/setter。

c.在getter/setter内部去操作(读/写)data中对应的属性。

发表评论