如果数据是引用数据类型,需要对数据进行额外的处理,处理分为对象和数组两种
1. 对象
每个对象处理之后,会添加一个__ob__
的属性, __ob__
下面有一个dep
属性,dep就是存储watcher的地方。
为什么引用类型不能使用dep
,因为dep只存在于defineReactive这个函数中,作为一个闭包形式的存在,__ob__.dep
在Vue.prototype.$set
和Vue.prototype.$delete
中都有使用到。
2. 数组
对数组而言,__ob__.dep
的作用是用于对数组相关方法的重写,便于实现数组的响应式。
3. 依赖收集
对于引用类型而言,它自己本身也会收集一遍依赖
get() {
var value = val
if (Dep.target) {
// 收集依赖进 dep.subs
dep.addSub(Dep.target);
// 如果值是一个对象,Observer 实例的 dep 也收集一遍依赖
if (childOb) {
childOb.dep.addSub(Dep.target)
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
}