修改了数组对象的原型,在原本的原型链上插入了一个新的原型对象,在新的原型对象上重写了7个变异方法(push/pop/unshift/shift/splice/sort/reverse)

var arrayProto = Array.prototype
var newArrayProto = Object.create(arrayProto)
newArrayProto.push = function (...rest) {
    // 监听到调用了数组的push方法,执行视图渲染的代码
    console.log('监听到调用了数组的push方法,执行视图渲染的代码,添加之前的逻辑。。。。')

    // 为了保留原来的数组push方法的逻辑
    arrayProto.push.call(this, ...rest)

    console.log('数组push方法添加之后的逻辑,。。。。。')
}
// 在递归遍历数据的时候,只要找到数组数据,就将其原型指向为newArrayProto
// arr.__proto__ = newArrayProto
var arr = [1,2,3]
arr.__proto__ = newArrayProto

在这里插入图片描述

为什么没有像对象一样用Object.defineProperty监听数组中所有的元素变化呢?

因为数组中的元素有可能有很多个,如果循环遍历,开销太大!不能这样。。。Vue给我们提供了支持驱动视图的API(this.$set,
Vue.set),还有重写了7个变异方法

Logo

Vue社区为您提供最前沿的新闻资讯和知识内容

更多推荐