ECMA标准定义了一个隐藏的内部属性[[Call]]
,如果实现,则表示该对象是可调用的/是一个函数。
在Python中,会发生类似的事情,除了您可以自己覆盖它以创建自己的可调用对象:
>>> class B:
... def __call__(self, x,y): print x,y
...
>>> inst = B()
>>> inst(1,2)
1, 2
标准JavaScript中是否有类似的机制?如果没有,那么当前的任何JavaScript实现呢?
答案 0 :(得分:2)
据我所知,这是不可能的。它应该是对象的内部属性,而不是暴露给脚本本身。我知道的唯一方法是定义一个函数。
但是,由于函数是一等公民,您可以向它们添加属性:
function myfunc(){
var myself = arguments.callee;
myself.anotherfunc();
}
myfunc.avalue=5;
myfunc.anotherfunc=function(){
alert(this.avalue);
}
myfunc(); //Alerts 5
myfunc.anotherfunc(); //Alerts 5
答案 1 :(得分:1)
[[Call]]是一个内部属性,用于描述语言规范中的特定功能。无法保证这样的房产甚至可以在翻译中使用。规范中引用了许多其他属性和对象,例如Completion对象,只有在将语言实现为AST解释器时才需要它,这是KJS和JavaScriptCore(JSC == WebKit fork of KJS)使用的去做。非基于AST的解释器(SpiderMonkey,新的KJS和JavaScriptCore执行引擎FrostByte和SquirrelFish,可能是Opera JS引擎和V8)不需要很多这些构造,因为它们主要用于描述行为 - 而不是实施
还有另一个原因是这种访问不可用 - 许多这些属性对解释器来说是固有的,允许自定义行为会影响性能,无论是否使用这些功能 - 例如JSC API提供了嵌入器覆盖大量这些属性的机制,并且即使在C级别支持它实际上也会产生可衡量的性能影响。
[编辑:次要注释,当我说“intrepreter”我的意思是在一般意义上 - 它可能是解释AST,字节码或机器代码(例如jit)]
答案 2 :(得分:1)
使用Javascript 1.5或更高版本的Mozilla Spidermonkey实现(例如Firefox)的应用程序可以访问__noSuchMethod__
机制:
c:\>jsdb
js>x = {};
[object Object]
js>x.__noSuchMethod__ = function(id,args) {writeln('you just called: '+id+'()');}
function (id, args) {
writeln("you just called: " + id + "()");
}
js>x.foo()
you just called: foo()
js>x.bar()
you just called: bar()
js>
答案 3 :(得分:0)
现在还不可能:[[Call]]被隐藏,并且在所有conformat实现中都不能直接使用。它可能会在new standard of ECMAScript中发生变化。