无法将"应用"陷阱设置为Proxy对象

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]]内部方法的定义,它应该工作:

但是,存在一个问题:并非所有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]]方法,因此使用函数声明或函数表达式对其进行定义.