SpiderMonkey:我如何从c获取当前JSObject的名称?

时间:2010-10-13 18:53:01

标签: javascript c spidermonkey

有人问how to get the value of a JSObject property from c。这对我有所帮助。

但是,有没有人知道如何从c获取对象的当前JavaScript名称?

示例:

var foo={prop:'bar'};

然后在jsapi.cpp中的某处:

JS_somemethod(JSContext *cx, JSObject *obj){

//how do i get the name 'foo' (or the current alias) here if *obj points to the foo (or whatever alias name) object?

}

提示和答案!

2 个答案:

答案 0 :(得分:1)

好的,只是为了记录您的评论中的问题澄清,我将在此重复:

  

也许我简单地告诉你我的目的:为了在web浏览器中集成新的安全系统,我需要找出在网站上的公共会话期间访问的内容。我的目标是获取一些日志,访问对象以及如何(读取,写入,执行)。例如:window.alert(x)window.foo.bar(w)...你现在为什么我需要变量的名称?也许你还有另外一个想法?

只是在前面说,这一般来说非常棘手。有几种选择,所有这些都有些困难:

  1. 使用调试API,可以通过cool new debugger object API或通过jsdbgapi.cpp(firebug使用的复杂且略微粗略的接口)来使用。您可以使用调试器功能来捕获所有属性访问,函数调用和本地引用,以便转储对象的有趣属性。
  2. 如果您只对访问 (用户定义)对象的方式感兴趣,可以使用Proxies来包装对象并转储对它们执行的访问。实际上,在浏览器中使用稍微强大且低级别的代理版本来实现我们的安全功能。 (此外,通过我们的元对象协议,JSAPI中的自定义创建对象可以访问大多数代理功能,但代理只是相同功能的更清晰版本。)
  3. 在jsinterp.cpp中检测解释器循环。许多类似研究的工作都会关闭JIT并对解释器循环进行检测,因为如果您以前从事语言实现,那么它是相当容易理解的。不幸的是,即使你有语言实现的经验,最初也很难将你想做的事情翻译成解释器循环检测。
  4. 调试器对象绝对是我在这里列出的那些人最喜欢的选项。如果你采用这种方法并最终卡住,请随时访问irc.mozilla.org中的#jsapi并尝试获取jorendorff或jimb,它们是a)非常棒和b)调试器对象的创建者。

答案 1 :(得分:0)

如果不仔细看API,我会说虽然在一些非常基本的情况下可能会这样做,但你不想这样做。这就是原因:

在Javascript中,与大多数语言一样,变量指向到值。变量本身不是值。该对象与foo名称无任何关系。

例如,您可以

var foo = {prop: 'bar'};
var fooo = foo;
var foooo = foo;
var quux = {q: foo, r: foo, s: [foo]};

所有这些foo现在都是完全相同的foo;你要回哪一个?没有API调用,因为它太模糊而且不是非常有用。

但是,如果您真的想要找到包含值的全局变量的一个,您可以尝试迭代全局对象上的键并测试它们的值。

for(var key in this){
  if(this[key] == myval){
    var myname = key;
  }
}

您必须将其转换为API调用,或者将其放入函数中并通过API调用

更简单直接的解决方案是找出你以后想要用foo做什么,然后传入一个回调函数来做到这一点,例如:与JS_CallFunction

tl; dr:上一段。