徒然this question .
对象有可能也是函数吗?
例如,我有对象person
,它是某个对象的实例。
我是否可以调用 person(...)
并获得一些返回?
这是 person没有被定义为函数的地方。
例如,我有一个“类”人:
class Person {
// .. some class functions
}
然后我创建一个新的
let person = new Person();
我可以调用 person()
并影响实际的对象行为吗?或者这根本不可能,而 person
本身必须首先定义为一个函数?
最佳答案
简短回答,否。是的!请参阅下面的代理解决方案。
在9.2.1部分该规范概述了 Function 对象的内部 [[Call]]
属性,该属性允许将该对象作为函数调用。目前我不知道如何修改该属性,即将对象创建后使其变为函数。通过完全兼容 ES 2015 的实现,可以对 Function 进行子类化并拥有可调用对象(例如,目前在 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 中测试。在 FF 中失败,除非 Person 扩展 Function 并调用 super:
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 中的一个错误,现已修复。
关于javascript - 一个对象有可能也是一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069951/