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

Javascript SpiderMonkey:如何从c中获取当前JSObject的名称?,javascript,c,spidermonkey,Javascript,C,Spidermonkey,有人问。这对我有点帮助 但是,有人知道如何从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) obje

有人问。这对我有点帮助

但是,有人知道如何从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?

}

Thx的提示和答案

在不仔细研究API的情况下,我想说,虽然在一些非常基本的情况下可以这样做,但您不希望这样做。这就是为什么:

在Javascript中,与大多数语言一样,变量指向值。变量不是值本身。对象与名称foo没有任何内在联系。

例如,你可以

var foo = {prop: 'bar'};
var fooo = foo;
var foooo = foo;
var quux = {q: foo, r: foo, s: [foo]};
所有那些
foo
s现在都是完全相同的foo;你想要哪一个?没有API调用,因为它太不明确,也没有太大的用处

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

for(var key in this){
  if(this[key] == myval){
    var myname = key;
  }
}
您必须将其转换为API调用,或者将其放入函数中并通过API调用

更简单、更直接的解决方案是在以后找出您希望对foo执行的操作,并传入一个回调函数来执行该操作,例如,使用


tl;dr:上一段。

如果不仔细看API,我会说,虽然在一些非常基本的情况下可能做到这一点,但您不想这么做。这就是为什么:

在Javascript中,与大多数语言一样,变量指向值。变量不是值本身。对象与名称foo没有任何内在联系。

例如,你可以

var foo = {prop: 'bar'};
var fooo = foo;
var foooo = foo;
var quux = {q: foo, r: foo, s: [foo]};
所有那些
foo
s现在都是完全相同的foo;你想要哪一个?没有API调用,因为它太不明确,也没有太大的用处

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

for(var key in this){
  if(this[key] == myval){
    var myname = key;
  }
}
您必须将其转换为API调用,或者将其放入函数中并通过API调用

更简单、更直接的解决方案是在以后找出您希望对foo执行的操作,并传入一个回调函数来执行该操作,例如,使用


tl;dr:上一段。

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

也许我可以简单地告诉你我的目的:为了在WebBrowser中集成新的安全系统,我需要找出在网站上的公共会话中访问的内容。我的目标是得到一个类似日志的东西,它可以访问哪些对象以及如何访问(读、写、执行)。例如:window.alert(x)window.foo.bar(w)。。。你现在知道为什么我需要变量的名称了吗?也许你还有别的想法

先说一句,总的来说这是相当棘手的。您可以选择几个选项,所有这些选项都有些困难:

  • 通过或通过jsdbgapi.cpp(firebug使用的复杂且略显粗糙的接口)使用调试API。您可以使用调试器功能捕获所有属性访问、函数调用和本地引用,以便转储对象的有趣属性
  • 如果您只对(用户定义的)对象的访问方式感兴趣,那么可以使用该方法包装对象并转储对其执行的访问。浏览器中实际上使用了一个功能更强大、级别更低的代理版本来实现我们的安全功能。(此外,对于JSAPI中自定义创建的对象,大多数代理功能都可以通过我们的元对象协议访问,但代理只是相同功能的一个更干净的版本。)
  • 在jsinterp.cpp中插入解释器循环。像work这样的大量研究关闭了JIT和解释器循环,因为如果您以前从事过语言实现,这是可以理解的。不幸的是,即使您有语言实现方面的经验,在一开始将您想要做的事情转换为解释器循环检测也并不总是容易的

  • 调试器对象绝对是我在这里列出的对象中最喜欢的选项。如果你采用这种方法并最终陷入困境,请访问irc.mozilla.org中的#jsapi并尝试获得jorendorff或jimb,他们a)很棒,b)调试器对象的创建者。

    好的,为了记录你评论中的问题澄清,我将在这里重复:

    也许我可以简单地告诉你我的目的:为了在WebBrowser中集成新的安全系统,我需要找出在网站上的公共会话中访问的内容。我的目标是得到一个类似日志的东西,它可以访问哪些对象以及如何访问(读、写、执行)。例如:window.alert(x)window.foo.bar(w)。。。你现在知道为什么我需要变量的名称了吗?也许你还有别的想法

    先说一句,总的来说这是相当棘手的。您可以选择几个选项,所有这些选项都有些困难:

  • 通过或通过jsdbgapi.cpp(firebug使用的复杂且略显粗糙的接口)使用调试API。您可以使用调试器功能捕获所有属性访问、函数调用和本地引用,以便转储对象的有趣属性
  • 如果您只对(用户定义的)对象的访问方式感兴趣,那么可以使用该方法包装对象并转储对其执行的访问。浏览器中实际上使用了一个功能更强大、级别更低的代理版本来实现我们的安全功能。(此外,JSAPI中自定义创建的对象可以通过我们的元对象协议访问大多数代理功能,但是