-
vue2 使用的是 Object.defineProperty
-
vue3 使用的是 proxy
通过对 data 中的数据进行劫持,添加 getter 和 setter,从而实现数据更新-视图更新。
Object.defineProperty
-
作用
-
可以监听对象的某个属性,添加 getter 和 settter
const obj = {}; let name = '悟空'; Object.defineProperty(obj, 'name', { get() { return name; }, set(val) { console.log('set'); name = val; }, }); console.log(obj.name); obj.name = '八戒'; console.log(obj.name);
-
弊端
-
- 无法监听新增属性
- 无法监听对象深层次属性
- 无法监听数组 ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']; 等方法
- vue2中 使用 数组方法 push 找到数组的原型 来重写 !!!
proxy
es6 新出的对象,翻译为代理。
不像 Object.defineProperty
监听的是属性,它监听的是整个对象。
-
可以监听新增属性
-
可以监听对象深层次属性
-
可以监听数组 ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']; 等方法
const obj = {
a: '悟空',
};
const proObj = new Proxy(obj, {
get(target, key) {
console.log('get');
return target[key];
},
set(target, key, value) {
target[key] = value;
},
});
console.log(proObj);
proObj.a = 23;
console.log(proObj);