官方文档:
当你把一个普通的JavaScript对象传入Vue实例作为data选项,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/setter。这些getter/setter对用户来说是不可见的,但是内部它们让Vue能够追踪依赖,在属性被访问和修改时通知变更。
所以Vue2.x的数据响应式是通过 Object.defineProperty 对数据进行劫持,同时结合观察者模式
Object.defineProperty 示例
<!-- Vue2.x 数据响应式原理 --><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>数据响应式</title></head><body><div id="app">Hello Vue</div><script>// 模拟Vue实例 data 数据let data = {msg: '响应式数据',count: 0}// 模拟Vue实例let vm = {};function defineProperty (data) {//data对象枚举自身属性,并返回数组Object.keys(data).forEach(key => {Object.defineProperty(vm,key,{// 可枚举(可以遍历)enumerable: true,// 可配置(可以使用delete 删除, 可以使用)configurable: true,// 获取值执行get() {console.log('getter:', data[key])return data[key]},// 更新值时执行set(newValue) {console.log('setter:', data[key])if(data[key] === newValue) {return ;}data[key] = newValuedocument.querySelector("#app").textContent=newValue;}})})}//将data 传入自定义函数中,将每一条属性赋予响应式defineProperty(data)vm.msg = 'Hello响应式'console.log(vm.msg);</script></body></html>
