JavaScript调用实现允许访问[[Call]]

2024-05-18 12:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

ECMA标准定义了一个隐藏的内部属性[[Call]],如果实现了,这意味着对象是可调用的/是一个函数。在

在Python中,会发生类似的情况,只是您可以自己重写它来创建自己的可调用对象:

>>> class B:
...     def __call__(self, x,y): print x,y
...
>>> inst = B()
>>> inst(1,2)
1, 2

在标准JavaScript中有没有类似的机制?如果没有,那么当前的JavaScript实现呢?在


Tags: 对象函数self标准属性定义def情况
3条回答

使用Javascript 1.5或更高版本的Mozilla Spidermonkey实现的应用程序(例如Firefox)可以访问^{}机制:

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>

据我所知这是不可能的。它应该是一个对象的内部属性,不暴露于脚本本身。我知道的唯一方法就是定义一个函数。在

但是,由于函数是头等公民,因此可以向其添加属性:

function myfunc(){
  var myself = arguments.callee;
  myself.anotherfunc();
}

myfunc.avalue=5;

myfunc.anotherfunc=function(){
  alert(this.avalue);
}

myfunc(); //Alerts 5
myfunc.anotherfunc(); //Alerts 5

[[Call]]是一个内部属性,用于描述语言规范中的特定功能。不能保证这样的属性甚至可以在翻译程序中使用。规范中还引用了许多其他属性和对象,例如Completion对象,只有当您将该语言实现为AST解释器时才需要它,而AST解释器正是KJS和JavaScriptCore(JSC==WebKit fork of KJS)经常做的事。非基于AST的解释器(SpiderMonkey、新的KJS和JavaScriptCore执行引擎FrostByte和SquirrelFish,可能是Opera JS引擎,以及V8)不需要太多这样的结构,因为它们主要用于描述行为,而不是实现。在

这种访问不可用还有另一个原因——这些属性中有很多是解释器固有的,允许自定义行为会影响性能,不管这些特性是否被使用——例如,JSC API提供了一种机制,让嵌入程序重写许多这些属性,即使是在C级别支持它,也会对性能产生显著的影响。在

[编辑:小提示,当我说“intrepreter”时,我是指一般意义上的--它可以解释AST、字节码或机器代码(例如jit)]

相关问题 更多 >

    热门问题