Object.defineProperty(简易版) 1234567891011121314151617181920212223// Vue2的响应式原理,结合了Object.defineProperty的数据劫持,以及发布订阅者模式// Vue2的数据劫持,就是通过递归遍历data里的数据,用Object.defineProperty给每一个属性添加getter和setter,// 并且把data里的属性挂载到vue实例中,修改vue实例上的属性时,就会触发对应的setter函数,向Dep订阅器发布更新消息,// 对应的Watcher订阅者会收到通知,调用自身的回调函数,让编译器去更新视图。 const obj = { name: '刘逍', age: 20 } const p = {} for (let key in obj) { Object.defineProperty(p, key, { get() { console.log(`有人读取p里的${key}属性`); return obj[key] }, set(val) { console.log(`有人修改了p里的${key}属性,值为${val},需要去更新视图`); obj[key] = val } }) }