- 重新定义数组原型
- 创建新对象,原型指向oldArrPrototype
const oldArrPrototype=Array.prototype;
const ArrProto=Object.create(oldArrPrototype);
['push','pop','shift','unshift'].forEach(methodName=>{
ArrProto[methodName]=function(){
updateView();//更新视图
oldArrPrototype[methodName].call(this,...arguments)
}
})
- 当observer的target为数组时,就将它的原型更改为上面创建的ArrProto,它里面重写了方法,当调用数组的push方法时,就会去调ArrProto中的push方法。
if(Array.isArray(target)){
target.__proto__=ArrProto
}
为什么不直接修改数组的原型呢?
这样会污染全局的Array原型。