Ori*_*iol 11 javascript proxy-classes function ecmascript-6
我创建了一个带有"apply"陷阱的Proxy对象:
var target = {},
handler = { apply: () => 42 }
proxy = new Proxy(target, handler);
Run Code Online (Sandbox Code Playgroud)
因此,Proxy对象应该是可调用的.但是,它不起作用:
proxy(); // TypeError: proxy is not a function
Run Code Online (Sandbox Code Playgroud)
为什么?
Ori*_*iol 22
根据Proxy对象的[[Call]]内部方法的定义,它应该工作:
- 设陷阱是GetMethod(处理程序,
"apply").- 返回调用(陷阱,处理程序,« target,thisArgument,CreateArrayFromList(argumentsList)»).
但是,存在一个问题:并非所有Proxy对象都具有[[Call]]方法:
如果其[[ProxyTarget]] 内部槽的初始值是具有[[Call]]内部方法的对象,则Proxy外来对象仅具有[[Call]]内部方法.
因此,目标必须是一个函数对象:
var target = () => {},
handler = { apply: () => 42 }
proxy = new Proxy(target, handler);
proxy(); // 42
Run Code Online (Sandbox Code Playgroud)
请注意,我target使用箭头函数定义,以创建一个不是构造函数的函数对象.这样可以调用Proxy对象但不实例化.
如果您还想添加"构造"陷阱,则目标必须具有[[Construct]]方法,因此使用函数声明或函数表达式对其进行定义.