前言
数组和对象更改数据的方式不太一样。一般情况下,对象会直接更改,而数组常常是用 push
、pop
等方法进行操作。因此 Vue2 对数组变化侦测的处理是改写 Array 的 push、pop 等方法。
改写的方式并不是直接覆盖 Array.prototype。而是在中间加一层原型对象。而且为了不污染全局的数组。只对需要建立监听的数组进行改造。改造的方式就是在数组和数组原型直接加一层自定义的原型。
修改一个对象原型的方式在 es6 中是 Object.setPrototypeOf
方法,但是在 es5 时代并没有对应的方法可以使用。只有一个非标准的 __proto__
属性,由于 __proto__
并不是在所有浏览器上都支持,因此 vue2 里面做了一个判断,如果当前浏览器没有 __proto__
属性,就退而求其次,直接将push
、pop
等方法添加到数组本身。