【发布时间】:2017-08-27 22:04:28
【问题描述】:
如何创建深度/递归Proxy?
具体来说,我想知道何时在对象树中的任何位置设置或修改属性。
这是我目前所得到的:
function deepProxy(obj) {
return new Proxy(obj, {
set(target, property, value, receiver) {
console.log('set', property,'=', value);
if(typeof value === 'object') {
for(let k of Object.keys(value)) {
if(typeof value[k] === 'object') {
value[k] = deepProxy(value[k]);
}
}
value = deepProxy(value);
}
target[property] = value;
return true;
},
deleteProperty(target, property) {
if(Reflect.has(target, property)) {
let deleted = Reflect.deleteProperty(target, property);
if(deleted) {
console.log('delete', property);
}
return deleted;
}
return false;
}
});
}
这是我的测试:
const proxy = deepProxy({});
const baz = {baz: 9, quux: {duck: 6}};
proxy.foo = 5;
proxy.bar = baz;
proxy.bar.baz = 10;
proxy.bar.quux.duck = 999;
baz.quux.duck = 777;
delete proxy.bar;
delete proxy.bar; // should not trigger notifcation -- property was already deleted
baz.quux.duck = 666; // should not trigger notification -- 'bar' was detached
console.log(proxy);
还有输出:
set foo = 5
set bar = { baz: 9, quux: { duck: 6 } }
set baz = 10
set duck = 999
set duck = 777
delete bar
set duck = 666
{ foo: 5 }
如您所见,我已经让它工作了,除了baz.quux.duck = 666 触发了setter,即使我已经从proxy 的对象树中删除了它。 baz属性被删除后有什么办法解除代理吗?
【问题讨论】:
-
你的意思是这样的? github.com/MaxArt2501/object-observe
-
这样的代理有什么好的用例?如何搜索更多相关信息?代理会返回很多噪音。这只是手写的“手表”吗?
-
@RatanKumar 这已被弃用并且有太多警告。甚至不确定它是否像我需要的那样“深”。
-
@mplungjan 用例?请参阅 React、反应式编程、MobX 或任何其他您希望在修改对象时刷新某些内容的场景。在我的特殊情况下,我想将对象写回磁盘并像持久数据库一样使用它。
-
谢谢 - PS:我的意思是“在 google 中搜索代理会返回很多噪音”
标签: javascript node.js proxy ecmascript-6