3

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

Node 看起来支持 apply 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我直接尝试和通过ProxyObject.assign来查看它是否需要成为自己的对象。都没有奏效。

4

2 回答 2

2

您在这里假设apply陷阱像get陷阱一样工作——即,对于代理对象的任何属性——但事实并非如此。当apply代理本身被调用一个函数时,陷阱就会运行。在这里,您的代理是Magic.Foo,但您从不调用Magic.Foo()。您只调用Magic.Foo.runme(),这不是代理函数。

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

或者,您可以使用一个get陷阱,Magic.Foo该陷阱会为每个访问的属性返回一个具有适当行为的函数。

于 2018-04-17T18:41:24.053 回答
1

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

于 2018-04-17T18:43:55.443 回答