对象的劫持比较容易:
let obj = {};
let _value = '';
let res = Reflect.defineProperty(obj, 'name', {
get() {
console.log('触发get');
return _value;
},
set(v) {
console.log('劫持set');
_value = v;
}
})
obj.name = '李四';//触发set
console.log(obj.name) // 触发get
但是对数组是无效的:
const arrayProto = Array.prototype;
Reflect.defineProperty(arrayProto,'unshift',{
get() {
console.log('触发get');
return _value;
},
set(v) {
console.log('劫持set');
_value = v;
}
});
var arr = [];
arr.unshift(100);//Uncaught TypeError: arr.unshift is not a function
那如何对数组进行劫持呢?
其实很容易,arr.unshift其实就是访问对象的unshift属性,也就是arr[‘unshift’],那把value设置为function,arr.unshift()就是执行这个函数:
const arrayProto = Array.prototype;
['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(method => {
const original = arrayProto[method];
Reflect.defineProperty(arrayProto, method, {
value: function (...args) { //劫持数组的方法
console.log('劫持Array的方法>>>', args);
return original.apply(this, [...args]);
},
enumerable: false,
writable: true,
configurable: true
});
});
var arr = [];
arr.unshift('jack');