# 对象
对象主要靠 Object.defineProperty api为对象的属性增加getter和setter。getter的作用是监听数据的访问,并收集依赖。setter的作用是改变数据时,进行视图更新或者函数响应。
# 对象依赖收集
- dep:是一个依赖的管理工具,可以增加,删除依赖,什么是依赖呢,就是谁更改了数据,谁就是依赖。vue中通过一个watcher来设置依赖。在dep中,depend依赖就是将watcher添加进依赖数组中。当在setter更新时,调用watcher的update方法更新视图或函数响应
# 数组
数组本身是可以被 Object.defineProperty 监听到的,因为数组可以看成一个对象,key 就是数组的下标,所以这样其实可以通过 arr[i] = 123 的形式让数组进行依赖收集。但是数组不仅是这样更改,还有原生的方法去更改它,所以用Object.definePropery就不能满足。
# 拦截器重写数组原生方法
vue拦截了数组的7个原生方法,push shift unshift pop reserve splice slice 。当数组调用方法时,触发了继承Array.prototype上的原生方法,这样就能做到拦截。数组也是在getter进行依赖收集的,在getter中判断当前数组是否有被观察也就是是否有__ob__属性,如果有则直接返回当前observe实例,如果没有则新建一个,observe的作用是将当前数组挂载到window.proto__上,因为原型的构造函数等于实例的__proto。并且vue做了一层向下兼容,如果浏览器没有__proto__属性的话,则为数组添加属性监听。这样,当数据被修改时,就能做到数组双向绑定。