1)数据代理{通过vm对象来代理data对象中的属性的操作(读/写)}
vm对象中没有data,因此不可以用vm.data.name。vm对象中存在vm._data,同data数据一致。当然vm对象还有getter/setter/$开头等数据。
下划线data(_data)中不仅含有那些属性及值,还有如下(用户数据拦截,让data变化的同时将窗口中的数据进行相同变化):
基本原理:
通过Object.defineProperty()把data对象中所有属性添加到vm上。(第一个图棕色和紫色映射)
为每一个添加到vm上的属性,都指定一个getter/setter。
在getter/setter内部去操作(读/写)data中对应的属性。(每次读/写属性都会调用getter/setter)
解决的问题:
如果没有数据代理的话,要调用vm中_data数据,需要这么写:
这样写会很麻烦, 有数据代理的话只需要这样,如下:
以上如果没有数据代理则上述不能这样写!