數(shù)據(jù)劫持 關(guān)鍵點(diǎn)運(yùn)用Object.defineProperty()函數(shù)
function observer(data){
if(!data || typeof data !== 'object'){
return;
}
// Object.keys遍歷對(duì)象的屬性,不包含原型鏈上的屬性
Object.keys(data).forEach(key => {
observerProperty(data, key, data[key]);
})
}
function observerProperty(data, key, val){
// 遞歸
observer(val);
Object.defineProperty(data, key, {
enumerable: true, // 可以枚舉
configrable: true, // 可重新定義
get: function(){
return val;
},
set: function(newVal){
if(val === newVal){
return;
}
console.log("數(shù)據(jù)更新啦", val, "=>", newVal);
val = newVal;
}
})
}
var person = {name: "Lucy"};
observer(person);
person.name="Mary";
//輸出:數(shù)據(jù)更新啦 lucy => Mary