Просто сначала создайте объект и сохраните ссылку на него перед созданием его прокси.
Теперь вы можете изменить любой из них (исходный объект или его прокси), а другой также получит изменения, если только выпредотвратить их на прокси:
const o = {};
const p = new Proxy(o, {
set: function(obj, prop, value) {
if (prop === 'd') {
return false;
}
obj[prop] = value;
return true;
},
});
// These operations are forwarded to the target object o:
p.a = 0;
p.b = 1;
// This one is prevented by the Proxy:
p.d = true;
// Both will have two properties, a and b:
console.log(o);
// You can also mutate the original object o and the Proxy will also get those changes:
o.c = false;
// Note that now the Proxy setter is not called, so you can do:
o.d = true;
// But the Proxy still gets the change:
console.log(p);
Если вы хотите получать уведомления, когда новое свойство добавляется, удаляется или изменяется на объекте без возможности использования исходной ссылки для непосредственного изменения исходного объекта,единственный вариант, который у вас есть, - создать этот объект напрямую в качестве прокси или перезаписать исходный:
// Created from an empty object without a reference to it:
// const p = new Proxy({}, { ... });
// Overwrite the original reference:
let myObject = { a: 1, b: 2 };
myObject = new Proxy(myObject, {
set: function(obj, prop, value) {
if (prop in obj) {
console.log(`Property ${ prop } updated: ${ value }`);
} else {
console.log(`Property ${ prop } created: ${ value }`);
}
obj[prop] = value;
return true;
},
deleteProperty(obj, prop) {
console.log(`Property ${ prop } deleted`);
delete obj[prop];
}
});
// Now there's no way to access the original object we
// passed in as the Proxy's target!
myObject.a = true;
myObject.a = false;
delete myObject.a;
Раньше был Object.prototype.watch()
, но он устарел.