前言

数组和对象更改数据的方式不太一样。一般情况下,对象会直接更改,而数组常常是用 pushpop等方法进行操作。因此 Vue2 对数组变化侦测的处理是改写 Array 的 push、pop 等方法。

改写的方式并不是直接覆盖 Array.prototype。而是在中间加一层原型对象。而且为了不污染全局的数组。只对需要建立监听的数组进行改造。改造的方式就是在数组和数组原型直接加一层自定义的原型。

修改一个对象原型的方式在 es6 中是 Object.setPrototypeOf方法,但是在 es5 时代并没有对应的方法可以使用。只有一个非标准的 __proto__属性,由于 __proto__并不是在所有浏览器上都支持,因此 vue2 里面做了一个判断,如果当前浏览器没有 __proto__属性,就退而求其次,直接将pushpop等方法添加到数组本身。

实现