【问题标题】:Can't set "apply" trap to Proxy object无法对代理对象设置“应用”陷阱
【发布时间】:2015-11-28 09:05:20
【问题描述】:

我创建了一个带有“应用”陷阱的代理对象:

var target = {},
    handler = { apply: () => 42 }
    proxy = new Proxy(target, handler);

因此,Proxy 对象应该是可调用的。但是,它不起作用:

proxy(); // TypeError: proxy is not a function

为什么?

【问题讨论】:

标签: javascript function ecmascript-6 proxy-classes


【解决方案1】:

根据[[Call]] internal method of Proxy objects 的定义,它应该可以工作:

但是有一个问题:并不是所有的Proxy对象都有[[Call]]方法:

一个代理外来对象只有一个 [[Call]] 内部方法,如果 其 [[ProxyTarget]] internal slot 的初始值是 具有 [[Call]] 内部方法的对象。

因此,目标必须是函数对象:

var target = () => {},
    handler = { apply: () => 42 }
    proxy = new Proxy(target, handler);
proxy(); // 42

请注意,我使用箭头函数定义了target,以便创建一个不是构造函数的函数对象。这样代理对象可以被调用但不能被实例化。

如果你也想添加“构造”陷阱,目标必须有一个 [[Construct]] 方法,所以用函数声明或函数表达式定义它。

【讨论】:

    【解决方案2】:

    我是从 Google 来这里搜索“可调用代理”的。
    虽然现有答案有效,但出于某些目的,还有另一种可能“更清洁”的选择:

    class Callable extends Function {
      constructor() {
        super()    
        return new Proxy(this, {
          apply: (target, thisArg, args) => target._call(...args)
        })
      }
      
      _call(...args) {
        console.log(this, args)
      }
    }
    

    您可以像往常一样在代理中定义所有陷阱。
    所有致谢arccoza and his gist here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 2016-12-12
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多