原理
数据劫持最基本的原理就是通过遍历为对象的每个属性都添加 getter,setter。
实现
更新器
当数据发生变化时会调用 updater。
function updater(){
console.log('更新视图')
}
遍历属性并添加监听
const data = {
name: 'rj',
age: 18,
address: {
location: '回龙观'
}
}
function observer(obj) {
if (typeof obj !== 'object') return obj;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
defineReactive(obj, key, obj[key])
}
}
}
function defineReactive(obj, key, value) { //value是个闭包
//递归
observer(value);
Object.defineProperty(obj, [key], {
get() {
return value;
},
set(newValue) {
if(value !== newValue){
updater(value, newValue);
//如果新值也是对象,也需要添加监听
observer(newValue);
value = newValue;
}
}
})
}
observer(data);
console.log(data.name, data.age); //rj 18
data.name = 'cj';
data.address.location = '山里';
data.address = {location:'天上'}
//如果不给新赋值添加监听,此处则不会触发更新,即29行
data.address.location = '人间';
/*
rj cj
开始更新
回龙观 山里
开始更新
{ location: [Getter/Setter] } { location: '天上' }
开始更新
天上 人间
开始更新
*/