在 javascript 中向代理添加(递归?)级别感知

ajm*_*jma 4 javascript ecmascript-6 es6-proxy

我试图通过使用代理覆盖我的对象 getter 来打印出正在通过 getter 访问哪些节点。我试图基本上测试这个大对象的哪些部分没有被我的应用程序使用。我遇到的问题是能够添加一些方法来识别吸气剂父母是什么。这是我到目前为止所拥有的

function tracePropAccess(obj) {
  return new Proxy(obj, {
    get(target, propKey, receiver) {
      console.log("Get fired on ", propKey);
      return Reflect.get(target, propKey, receiver);
    }
  });
}

const testObj = {
  a: 1,
  b: {
    a: "no",
    b: "yes"
  },
  c: {
    a: "green",
    b: {
      a: "blue",
      b: "orange"
    }
  }
};

const tracer = tracePropAccess(testObj);

tracer.b.a;

tracer.a;

tracer.c.c.a;
Run Code Online (Sandbox Code Playgroud)

这对于向我展示道具钥匙非常有效 - 但它只是第一层的钥匙。我不确定如何使用此代理来处理此问题,因为此单个函数会覆盖所提供对象中的所有代理。有什么方法可以传递对象的父母/孩子吗?可能我也错误地处理了这个问题 - 所以我正在寻找任何意见。谢谢!

Nin*_*olz 5

您可以使用反射并检查它是否是一个对象。如果是,则返回代理,如果不是,则返回值。

它不适用于未完成的对象,因为代理不知道何时返回对象作为结果或何时使用代理

例子:

{ foo: { bar: { baz: 42 } } }
Run Code Online (Sandbox Code Playgroud)

tracer.foo.bar
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它应该返回

{ baz: 42 }
Run Code Online (Sandbox Code Playgroud)

但它返回一个新的代理,这会导致奇怪的结果。主要问题是知道还有哪些键即将到来,并且使用这种符号,不可能知道下一个或没有键是什么。

{ foo: { bar: { baz: 42 } } }
Run Code Online (Sandbox Code Playgroud)

有路径

末尾有路径。