如何在嵌套对象中处理ownKeys的所有陷阱?
我只知道如何处理一个深层对象:
function wrap(obj, fn) {
var handler = {
ownKeys(target) {
fn(target)
return target
}
}
return new Proxy(obj, handler)
}
var origObj = {
a: {
b: {
c: 0
}
}
}
var wrappedObj = wrap(origObj, console.log)
Object.keys(wrappedObj) // => actual = expected: { a: { b: { c: 0 } } }
Object.keys(wrappedObj.a) // => actual: not working, expected: { b: { c: 0 } }
Object.keys(wrappedObj.a.b) // => actual: not working, expected: { c: 0 }
编辑1:
如果我尝试包装每个内部对象(来自此answer),那么它会记录所有步骤而不仅仅是最后一步。 “所有步骤”我的意思是代理的内部过程遍历整个嵌套对象,因此它多次触发fn(target)
但我想只触发一次。
编辑2:
所以看起来问题出在节点environmnent(节点版本8.1.4)中proxy
看起来坏了。在Chrome控制台中,一切都还可以。
答案 0 :(得分:1)
您必须为每个对象创建一个代理:
var wrappedObj = wrap({
a: wrap({
b: wrap({
c: 0
}, console.log)
}, console.log)
}, console.log)
如果您不想显式地执行此操作,您当然也可以使用递归遍历对象以编程方式执行包装,或者您通过get
陷阱在每次属性访问时动态创建代理。