Javascript 代理-handler.ownKeys()-嵌套对象

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

如何处理嵌套对象中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 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开发工具中如预期的那样显示)我明白了!有意思。。谢谢你的澄清!:)