原理
数据劫持最基本的原理就是通过遍历为对象的每个属性都添加 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 18data.name = 'cj';data.address.location = '山里';data.address = {location:'天上'}//如果不给新赋值添加监听,此处则不会触发更新,即29行data.address.location = '人间';/*rj cj开始更新回龙观 山里开始更新{ location: [Getter/Setter] } { location: '天上' }开始更新天上 人间开始更新*/
