Proxy - handler.ownKeys() - 嵌套对象

时间:2017-08-31 06:21:48

标签: javascript object proxy ecmascript-6

如何在嵌套对象中处理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)但我想只触发一次。

Output in the console

编辑2:

所以看起来问题出在节点environmnent(节点版本8.1.4)中proxy看起来坏了。在Chrome控制台中,一切都还可以。

1 个答案:

答案 0 :(得分:1)

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

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

如果您不想显式地执行此操作,您当然也可以使用递归遍历对象以编程方式执行包装,或者您通过get陷阱在每次属性访问时动态创建代理。