我们都知道在vue示例中,data数据发生改变时,视图层也会发生改变,匹配更新为最新的值。
也正是因为这个系统,让我们可以脱离界面的束缚,只需要操作数据。往下看⬇⬇⬇⬇⬇
Object.defineProperty
这个方法,是 Vue 响应式系统的精髓,骨髓,脑髓
使用 Object.defineProperty 可以为对象中的每一个属性,设置 get 和 set 方法
那么 get 和 set 方法有什么用?
get 值是一个函数,当属性被访问时,会触发 get 函数
set 值同样是一个函数,当属性被赋值时,会触发 set 函数
举个例子
var obj={ name:"阿峰"}Object.defineProperty(obj,"name",{get(){ console.log("get 被触发") },set(val){ console.log("set 被触发") } })复制代码
当我访问 obj.name 时,会打印 ' get 被触发
'当我为 obj.name 赋值时,obj.name = 5,会打印 ' set 被触发 '
以上面的 Vue 实例 为例
当 name 改变的时候,name 会遍历自己的 依赖收集器 subs,逐个通知 watcher,让 watcher 完成更新
这里 name 会通知 页面A,页面A 重新读取新的 name ,然后完成渲染
总结一下
- Object.defineProperty - get ,用于 依赖收集
- Object.defineProperty - set,用于 依赖更新
- 依赖收集器 subs 保存的依赖是 watcher
- watcher 可用于 进行视图更新