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>
[[Call]]是一个内部属性,用于描述语言规范中的特定功能。不能保证这样的属性甚至可以在翻译程序中使用。规范中还引用了许多其他属性和对象,例如Completion对象,只有当您将该语言实现为AST解释器时才需要它,而AST解释器正是KJS和JavaScriptCore(JSC==WebKit fork of KJS)经常做的事。非基于AST的解释器(SpiderMonkey、新的KJS和JavaScriptCore执行引擎FrostByte和SquirrelFish,可能是Opera JS引擎,以及V8)不需要太多这样的结构,因为它们主要用于描述行为,而不是实现。在
使用Javascript 1.5或更高版本的Mozilla Spidermonkey实现的应用程序(例如Firefox)可以访问^{} 机制:
据我所知这是不可能的。它应该是一个对象的内部属性,不暴露于脚本本身。我知道的唯一方法就是定义一个函数。在
但是,由于函数是头等公民,因此可以向其添加属性:
[[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)]
相关问题 更多 >
编程相关推荐