对象也可以成为一个函数。
例如,我有一个对象person
,它是某个对象的实例。
我是否可以致电person(...)
并回复给我一些回复?
这是人们不被定义为开始的功能的地方。
例如,我有“类”人:
class Person {
// .. some class functions
}
然后我创建一个新的
let person = new Person();
我可以调用person()
并影响实际的对象行为吗?或者根本不可能,person
本身必须被定义为一个开始的函数?
答案 0 :(得分:1)
简短回答,否。是!请参阅下面的代理解决方案。
在规范的9.2.1部分中,它概述了Function对象的内部[[Call]]
属性,该属性允许将该对象作为函数调用。目前我无法修改该属性,即在创建对象后将其置于函数中。通过完全兼容的ES 2015实现可以实现子类的功能并具有可调用对象(例如,当前在FF中工作)。即使这样,我也没有尝试过比在Function构造函数本身上制作薄薄的图层更多的东西。但是,ES 2015还包括Proxies,其中一个代理陷阱是“apply”。
class Person {
constructor(arg, body) {
this.fn = function(a) { this.a = a; };
return new Proxy(this, {
apply: function(target, thisArg, args) {
return target.fn.apply(target, args);
}
});
}
}
var person = new Person();
person(3);
person.a; //3
在Chrome中测试49.除非Person扩展Function并调用super:
,否则在FF中失败class Person extends Function {
constructor() {
super();
this.fn = function(a) { this.a = a; };
return new Proxy(this, {
apply: function(target, thisArg, args) {
return target.fn.apply(target, args);
}
});
}
}
var person = new Person();
person(3);
person.a;
根据MDN,关于要求super
调用的部分至少是正确的(对于子类)但是我不确定代理是否应该让你以chrome允许的方式调用非函数。
我打开了另一个关于哪个行为正确的question。对于那些懒得跟随超链接的人来说,调用非函数是某些特定版本的chrome中的一个错误,该错误已被修复。