数组考虑性能原因没有用defineProperty对数组的每一项进行拦截,而是选择重写数组 方法以进行重写。当数组调用到这 7 个方法的时候,执行 ob.dep.notify() 进行派发通知 Watcher 更新;

重写数组方法:push/pop/shift/unshift/splice/reverse/sort

补充回答:

在Vue中修改数组的索引和长度是无法监控到的。需要通过以下7种变异方法修改数组才会触发数组对应的wacther进行更新。数组中如果是对象数据类型也会进行递归劫持。

说明:那如果想要改索引更新数据怎么办?

可以通过Vue.set()来进行处理 =》 核心内部用的是 splice 方法。

// 取出原型方法;

const arrayProto = Array.prototype

// 拷贝原型方法;

export const arrayMethods = Object.create(arrayProto)

// 重写数组方法;

def(arrayMethods, method, function mutator (…args) { }

ob.dep.notify() // 调用方法时更新视图;