Can't set 'trap发送到代理对象
Can't set "apply" trap to Proxy object
我创建了一个带有"apply"陷阱:
var target = {},
handler = { apply: () => 42 }
proxy = new Proxy(target, handler);
proxy(); // TypeError: proxy is not a function
因此,Proxy对象应该是可调用的。然而,它不工作。
为什么?
根据代理对象的[[Call]]内部方法的定义,它应该工作:
- 让trap为GetMethod(handler,
"apply"
)。- Return Call(trap, handler,«target, thisArgument, CreateArrayFromList(argumentsList)»)
然而,有一个问题:不是所有的代理对象都有[[Call]]方法:
一个代理外部对象只有在[[Call]]内部方法其内部槽位[[ProxyTarget]]的初始值为1[[Call]]的内部方法。
因此,目标必须是一个函数对象:
var target = () => {},
handler = { apply: () => 42 }
proxy = new Proxy(target, handler);
proxy(); // 42
注意,我使用箭头函数定义target
是为了创建一个不是构造函数的函数对象。这样可以调用Proxy对象,但不能实例化。
如果你也想添加一个"construct"陷阱,目标必须有一个[[construct]]方法,所以用函数声明或函数表达式来定义它。
我从Google搜索'callable proxy'来到这里。
虽然现有的答案有效,但对于某些目的,还有另一种选择可能"更干净":
class Callable extends Function {
constructor() {
super()
return new Proxy(this, {
apply: (target, thisArg, args) => target._call(...args)
})
}
_call(...args) {
console.log(this, args)
}
}
您可以像往常一样在代理中定义所有陷阱。
所有的功劳都归功于arccoza和他的主旨。
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 得到"TypeError:对象不是函数“”;在forEach循环中使用超级测试/超级代理时
- 为可以从Dart调用的JavaScript对象创建代理/传递的最干净方法
- 超级代理“请求”对象被重新定义为函数
- 如何打开反代理对象,以便将它们序列化为Json
- 有没有一种方法可以在javascript对象中代理变量
- 代理和目标对象之间的相等性
- NodeJS+http代理-对象没有方法'简历'
- 如何删除由代理创建的对象的属性
- Javascript代理:node-proxy, Harmony,带魔法getter和setter的混合对象.Coffe
- Can't set 'trap发送到代理对象
- 用于构造代理对象的JavaScript模式,使用经典继承
- 检查代理对象是否被撤销
- 代理对象不能添加到DOM(陷阱也不会触发)
- Chrome javascript代理对象未定义
- 使用数组代理在项被推入时按属性对对象自动排序
- 用我自己的替换AngularJS或BreezeJS ajax对象来允许服务器端代理
- 从代理事件调用对象方法
- 链接JavaScript (ES6)代理对象