Javascript 代理-handler.ownKeys()-嵌套对象
如何处理嵌套对象中OwnKey的所有陷阱 我只知道如何处理一层深的对象:Javascript 代理-handler.ownKeys()-嵌套对象,javascript,object,proxy,ecmascript-6,Javascript,Object,Proxy,Ecmascript 6,如何处理嵌套对象中OwnKey的所有陷阱 我只知道如何处理一层深的对象: function wrap(obj, fn) { var handler = { ownKeys(target) { fn(target) return target } } return new Proxy(obj, handler) } var origObj = { a: { b: { c: 0 } } } var wrappe
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:
如果我尝试包装每个内部对象(从这个),那么它会记录所有步骤,而不仅仅是最后一个步骤。我所说的“所有步骤”是指代理的内部进程,它会遍历整个嵌套对象,因此会多次触发fn(target)
,但我只想触发一次
编辑2:
因此,问题似乎出在节点环境(节点版本8.1.4)中,
proxy
看起来已损坏。在chrome控制台中一切正常。您必须为每个对象创建代理:
var wrappedObj = wrap({
a: wrap({
b: wrap({
c: 0
}, console.log)
}, console.log)
}, console.log)
如果不想显式地这样做,当然也可以使用递归遍历对象,以编程方式进行包装,或者通过
get
trap在每个属性访问上动态创建代理。只有origObj
被代理,内部对象不被代理。是,我知道这就是为什么我问如何才能为嵌套对象(我的英语是sry)做到这一点。如果你不想递归地创建代理,你需要遍历代理中的目标。这不起作用,因为它记录所有步骤,而不仅仅是最后一个。@MatejMazur“仅仅是最后一个”是什么意思?我以为你想要三个对象。键调用中的每一个都触发日志。我已经用控制台的屏幕截图更新了我的问题,在那里可以看到输出。@MatejMazur啊,我明白了。这似乎是您的控制台的一个问题,console.log
本身会枚举已记录对象的内容,从而再次触发其陷阱。请尝试在其他环境中或使用其他回调函数。(例如,它在Chrome开发工具中如预期的那样显示)我明白了!有意思。。谢谢你的澄清!:)