-
什么是数据代理?
(1)配置对象
data
中的数据,会被收集到vm._data
中,然后通过Object.defineProperty让vm
上拥有data中所有的属性(2)当访问
vm
的msg
时,返回的是_data
当中同名属性的值(3)当修改
vm
的msg
时,修改的是_data
当中同名属性的值 -
为什么要数据代理?
为了更加方便的读取和修改
_data
中的数据,不进行数据代理就只能通过vm._data.msg
访问数据 -
为什么要先将数据收集在
_data
中,然后再代理出去?为了更高效的监听数据(直接收集到vm上会导致监视效率降低)
- 模拟Vue数据代理的的实现:
<script>
// 模拟数据代理
let _data = {msg:'helloworld'}
let vm = {}
Object.defineProperty(vm,'msg',{
//修改vm.msg时,set被调用并接收到修改后的值作为参数
set(value){
_data.msg = value
},
// 读取vm.msg时,get被调用
get(){
return _data.msg
}
})
</script>