1

有人问如何从 c 获取 JSObject 属性的值。这对我有点帮助。

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

}

谢谢提示和答案!

4

2 回答 2

1

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

也许我简短地告诉你我的目的:为了在网络浏览器中集成新的安全系统,我需要找出在网站上的公共会话期间访问的内容。我的目标是获得类似日志的东西,哪些对象被访问以及如何访问(读、写、执行)。例如:window.alert (x) window.foo.bar (w) ...你现在为什么我需要变量的名称?也许你有其他想法?

只是提前说一下,这通常是相当棘手的。有几个选项可供您使用,所有这些都有些困难:

  1. 使用调试 API,可以通过酷炫的新调试器对象 API或通过 jsdbgapi.cpp(firebug 使用的复杂且略显粗糙的接口)。您可以使用调试器功能来捕获所有属性访问、函数调用和本地引用,以便转储对象的有趣属性。
  2. 如果您只对访问(用户定义的)对象的方式感兴趣,可以使用代理来包装您的对象并转储对它们执行的访问。浏览器中实际上使用了稍微强大且低级的代理版本来实现我们的安全功能。(此外,大多数代理功能都可以通过我们的元对象协议在 JSAPI 中访问自定义创建的对象,但代理只是相同功能的更简洁的版本。)
  3. 在 jsinterp.cpp 中检测解释器循环。很多类似研究的工作会关闭 JIT 并检测解释器循环,因为如果您之前从事过语言实现,这是相当容易理解的。不幸的是,即使你有语言实现方面的经验,一开始将你想做的事情翻译成解释器循环检测并不总是那么容易。

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

于 2012-01-09T17:48:28.283 回答
0

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

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

例如,你可以做

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

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

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

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

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

更简单直接的解决方案是弄清楚你以后想用 foo 做什么,并传入一个回调函数来做这件事,例如使用JS_CallFunction

tl;博士:上一段。

于 2010-10-13T19:07:55.027 回答