【问题标题】:Why is my function proxy not being called in Node?为什么我的函数代理没有在 Node 中被调用?
【发布时间】:2018-04-17 18:06:06
【问题描述】:

我使用代理get 方法很好。然后我尝试在一个函数上使用它并很快意识到我需要使用apply 方法。这个简单的例子不起作用。它从不进入 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 来查看它是否需要成为自己的对象。都没有用。

【问题讨论】:

标签: node.js ecmascript-6 es6-proxy


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2018-06-18
      相关资源
      最近更新 更多