vue响应式原理—–get/set
什么是响应式?
要说什么是响应式, 那么就要知道什么不是响应式,看个例子
1 | let a = 1; |
这里就要提出一个属性Object.defineProperty()
使用方法为:
1 | Object.defineProperty(obj, 'keyName', { |
依赖跟踪

每个vue的实例都会有一个watcher对象,这个对象中提供提供增加依赖和发布依赖的方法。增加依赖在于getter部分把当数据更新的操作增加, 而在单个属性发生改变,也就是set的时候触发notify, 执行更新操作。在这里用了设计模式中的发布-订阅模式
每个vue实例就是我们的订阅者, 这些订阅者的更新事件都放到watcher对象里区管理。当我们增加一个依赖项的时候把依赖项放入订阅队列, 然后在每次更新的时候区触发对应的事件。完成更新。
1 | // 一个依赖项就是一个watch |
结合get/set与依赖跟踪,完成一个小型观察者对象
1 | class Dep { |
2019.08.16
很震撼啊,这东西写得好精巧啊.
重新理一下,如果你要做到响应式.那么你应该有什么?
- 你要有监测机制, 因为如果你不知道什么时候改变,那么你就不会知道啥时候响应
- 你要有依赖收集, 因为你不能预知依赖到底有多少, 那么你就得管理依赖项
- 你要有响应机制, 你检测到了更新, 继而触发依赖收集, 下一步就是在数据更新的时候, 根据收集到的依赖, 去触发响应, 更新依赖项
以上这三点, 的实现分别为:
- 检测机制用 get/set方法进行检测, 作为依赖收集, 触发响应的事件分发点
- 依赖收集和响应机制我们使用dep这个类来完成, 供检测机制调用
- 使用autorun包裹存在依赖的操作, 并生成引用, 供dep依赖收集
1 | // 1. get/set批量依赖检测 |