我想构建一个检测对象更改的代理:
- 定义了新属性。
- 现有属性已更改。
代码示例 1 - defineProperty
const me = {
name: "Matt"
}
const proxy = new Proxy(me, {
defineProperty: function(target, key, descriptor) {
console.log(`Property ${key} defined.`);
return Object.defineProperty(target, key, descriptor);
}
});
proxy // { name: 'Matt' }
proxy.name = "Mark";
// Property name defined.
// Mark
proxy.age = 20;
// Property age defined.
// 20
代码示例 1 - 观察
proxy
有一个属性name
,这是我所期望的。- 更改
name
属性告诉我name
已定义;不是我所期望的。 - 定义
age
属性告诉我age
已经定义了;正如我所料。
代码示例 2 - 设置
const me = {
name: "Matt"
}
const proxy = new Proxy(me, {
defineProperty: function(target, key, descriptor) {
console.log(`Property ${key} defined.`);
return Object.defineProperty(target, key, descriptor);
},
set: function(target, key, value) {
console.log(`Property ${key} changed.`);
return target[key] = value;
}
});
proxy // { name: 'Matt' }
proxy.name = "Mark";
// Property name changed.
// Mark
proxy.age = 20;
// Property age changed.
// 20
代码示例 2 - 观察
proxy
有一个属性name
,这是我所期望的。- 更改
name
属性告诉我name
已更改;正如我所料。 - 定义
age
属性告诉我age
已经改变了;不是我所期望的。
问题
- 为什么
defineProperty
捕获属性变化? - 为什么要添加
set
overridedefineProperty
? - 如何让代理正确捕获
defineProperty
新属性和set
属性更改?