一、Object.defineProperty()
控制对象的属性值
let num = 18;
let person = {name: 'mary',age: num;
};Object.defineProperty(person, 'age', {writable: true, // 控制属性是否可以修改. 默认值是 falseenumerable: true, // 控制属性是否可以枚举,默认值是 falseconfigurable: true // 控制属性是否可以被删除,默认值是 false// 当有人读取 person.age 时,get 函数(getter)就会被调用,且返回值就是 age 的值get() {console.log('有人读取了 age 属性');return num;},// 当有人修改 person.age 时,get 函数(setter)就会被调用,就会收到具体修改的值set(val) {console.log('有人修改了 age 属性');age = val;}
})
二、数据代理:
let obj1 = {x: 100};
let obj2 = {y : 200};Object.defineProperty(obj2, 'x', {get() {return obj1.x;},set(val) {obj1.x = val;}
})// 修改 obj2.x 的值,obj1.x 的值也会相应的更改
三、Vue 中的数据代理
<!--1. VueProject 中的数据代理:通过 vm 对象来代理 data 对象中的属性的操作(读/写)2. VueProject 中数据代理的好处:更加方便的操作 data 中的数据3. 基本原理:通过 Object.defineProperty() 把 data 对象中所有属性添加到 vm 上。为每一个添加到 vm 上的属性,都指定一个 getter / setter在 getter / setter 内部去操作(读 / 写)data 中对应的属性vm._data 里面用到数据劫持,为的是监听数据是否发生变化,以便响应式的更新到页面
-->