【问题标题】:Proxy - handler.ownKeys() - nested object代理 - handler.ownKeys() - 嵌套对象
【发布时间】:2017-08-31 06:21:47
【问题描述】:

如何处理嵌套对象中 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:

所以看起来问题出在proxy 看起来损坏的节点环境(节点版本 8.1.4)上。在 chrome 控制台中一切正常。

【问题讨论】:

  • 只有origObj被代理,内部对象没有。
  • 是的,我知道这就是为什么我问如何为嵌套对象做到这一点(对不起我的英语)。
  • 如果不想递归创建代理,需要遍历代理内部的target

标签: javascript object proxy ecmascript-6


【解决方案1】:

您必须为每个对象创建一个代理:

var wrappedObj = wrap({
  a: wrap({
    b: wrap({
     c: 0
    }, console.log)
  }, console.log)
}, console.log)

如果您不想明确地这样做,您当然也可以使用递归遍历对象以编程方式进行包装,或者您确实通过get 陷阱在每个属性访问时动态创建代理。

【讨论】:

  • 这不起作用,因为它记录了所有步骤,而不仅仅是最后一个。
  • @MatejMazur “只是最后一个”是什么意思?我以为你希望三个 Object.keys 调用中的每一个来触发日志。
  • 我已经用控制台的屏幕截图更新了我的问题,在该屏幕截图中可以看到输出。
  • @MatejMazur 啊,我现在明白了。这似乎是您的控制台的问题 - console.log 本身确实枚举了记录对象的内容,再次触发了它的陷阱。尝试在另一个环境中或使用不同的回调函数。 (例如,它在 Chrome devtools 中按预期显示)
  • 我明白了!有趣..感谢您的澄清! :)
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多