为什么我的函数代理没有在 Node 中被调用?

Why is my function proxy not being called in Node?

我使用代理 get 方法很好。然后我尝试在一个函数上使用它,并很快意识到我需要使用 apply 方法。这个简单的例子不起作用。它永远不会进入申请。

Node 看起来支持应用 https://node.green/#ES2015-built-ins-Proxy--apply--handler。不确定我做错了什么。

var Foo = {
  runme: function() {
    return 1;
  }
};

var Magic = {
  Foo: Foo
};

Magic.Foo = new Proxy(Object.assign({}, Magic.Foo), {
  apply: function(target, thisArg, argumentsList) {
    // never gets in here
    console.log('Proxying function call');
    console.log(target);
    return 2;
  }
});

console.log(Foo.runme()); // outputs 1
console.log(Magic.Foo.runme()); // outputs 1

我在 Magic.foo 上直接和通过 Object.assign 尝试了 Proxy,看看它是否需要成为自己的对象。都没有用。

您在这里假设 apply 陷阱像 get 陷阱一样工作——即,对于代理对象的任何 属性——但它们不是。 apply 陷阱在 Proxy 本身被调用时运行。在这里,您的代理是 Magic.Foo,但您从不调用 Magic.Foo()。您只调用 Magic.Foo.runme(),这不是代理函数。

您必须将您希望拦截其调用的每个函数包装在其自己的单独 Proxy 包装器中。

或者,您可以在 Magic.Foo 上使用 get 陷阱,returns 一个函数对每个访问的 属性.

具有适当的行为

apply 陷阱仅适用于创建可调用对象(即函数)的函数代理。在普通对象(如您的 {})上创建的 new Proxy 创建一个不可调用的代理对象,它永远不会触发 apply.