【问题标题】: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。