1 说明
所谓“数据代理”,是指 通过一个对象代理对另一个对象的属性进行读或写操作。
2 简单示例
2.1 代码
let obj = {x:100};
let obj2 = {y:200};
Object.defineProperty(obj2,"x",{
get(){
return obj.x;
},
set(value){
obj.x = value;
}
})
2.2 效果
通过obj2代理对obj的属性进行操作,如下所示
设置obj2.x=333,obj.x值也改变
3 Vue中的数据代理
3.1 代码
<body> <div id="root"> <h1>{{name}}</h1> <h1>{{address}}</h1> </div> <script type="text/javascript" > let data = { name:'历史', address:'杭州' } const vm = new Vue({ el:'#root', data }) </script> </body>
3.2 效果
Vue中的数据代理是:通过vm对象代理对data对象的属性进行操作(读或写),如下所示
设置vm.name的值,data.name也改变
另外,请注意一点:vm._data === data
,返回true
3.3 基本原理
3.3.1 说明
Vue中数据代理的基本原理是,通过Object.defineProperty()
将data对象中的属性添加到vm对象上,并为每个添加到vm上的属性指定getter和setter,在getter和setter中对data对象的属性进行读或写操作
3.3.2 示例
代码同上
控制台查看vm对象,发现它有address属性和name属性,还有一个_data属性
查看这三个属性的值,发现就是data对象的值。
所以vue是这么做的,data对象放在_data里面,且在vm最外层添加了属性address和name,并且给了setter和getter函数,代理data对象
3.3.3 图示