监听数组变化
function monitorArr(arr,callback){
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);
var newArrProto = [];
[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
].forEach(function(method){
// 原生Array的原型方法
var original = arrayMethods[method];
// 将push,pop等方法重新封装并定义在对象newArrProto的属性上
// 这里需要注意的是封装好的方法是定义在newArrProto的属性上而不是其原型属性
// newArrProto.__proto__ 没有改变
newArrProto[method] = function mutator() {
console.log('监听到数组的变化啦!');
original.apply(this, arguments)
// 调用对应的原生方法并返回结果(新数组长度)
if (typeof callback == 'function') {
callback(this);
}
//return original.apply(this, arguments);
}
})
arr.__proto__ = newArrProto;
}
function getArr(arr){
console.log(arr,'123')
}
let arr=[1,2];
//调用
monitorArr(arr,getArr)
arr.push(3)
//结果 getArr console
[1,2,3]
网友评论