【问题标题】:SpiderMonkey: How do i get the name of the current JSObject from c?SpiderMonkey:如何从 c 中获取当前 JSObject 的名称?
【发布时间】:2010-10-13 18:53:00
【问题描述】:

有人问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?

}

感谢提示和答案!

【问题讨论】:

    标签: javascript c spidermonkey


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      在不仔细研究 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 调用 that

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

      tl;dr: 上一段。

      【讨论】:

      • 您好杰西,非常感谢您的回答。你的解释非常清楚易懂。从用户脚本的角度来看,您是绝对正确的。但它是否也适用于当前执行的上下文(JSContext)?我们真的没有能力区分foo、foo和foooo吗?如果即使所有 foo* 都指向同一个对象,也可以在运行时执行此操作,那将是完美的。感谢您提出迭代对象的想法。干杯。
      • 很好,很高兴有帮助。同样,不,如果您只获得 foo、fooo 和 foooo 所持有的值,则没有什么可以区分它们。
      • 好的,你现在说服了我 ;) 我现在要获得“名称链”是:从给定对象开始,转到其父对象(使用 JS_GetParent())然后迭代遍历所有属性并比较对象直到匹配。希望它有效。
      • 看起来 JS_GetParent() 将从对象字面量中返回对象的全局对象。你确定那是你想要的吗?就像我说的那样,我仍然建议为您尝试做的任何事情使用回调函数。
      • 我对 SpiderMonkey 开发还很陌生。也许我简短地告诉你我的目的:为了在网络浏览器中集成新的安全系统,我需要找出在网站上的公共会话期间访问的内容。我的目标是获得类似日志的东西,哪些对象被访问以及如何访问(读、写、执行)。例如: window.alert (x) window.foo.bar (w) ...你现在为什么我需要变量的名称?也许你有其他想法?
      猜你喜欢
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 2019-02-28
      • 2016-11-02
      • 2010-09-19
      • 2013-08-21
      • 2013-04-09
      • 2013-08-06
      相关资源
      最近更新 更多