I want to build a proxy that detects changes to an object:
- New properties are defined.
- Existing properties are changed.
Code Sample 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
Code Sample 1 - Observations
proxyhas a propertynamewhich is what I'd expect.- Changing the
nameproperty tells me thatnamehas been defined; not what I'd expect. - Defining the
ageproperty tells me thatagehas been defined; as I'd expect.
Code Sample 2 - set
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
Code Sample 2 - Observations
proxyhas a propertynamewhich is what I'd expect.- Changing the
nameproperty tells me thatnamehas been changed; as I'd expect. - Defining the
ageproperty tells me thatagehas been changed; not what I'd expect.
Questions
- Why does
definePropertycatch property changes? - Why does the addition of
setoverridedefineProperty? - How do I get the proxy to correctly trap
definePropertyfor new properties andsetfor property changes?