1

誰かがc から JSObject プロパティの値を取得する方法を尋ねました。それは私を少し助けました。

しかし、オブジェクトの現在の JavaScript 名を c から取得する方法を知っている人はいますか?

例:

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

さて、コメントからの質問の説明を文書化するために、ここで繰り返します。

私の目的を簡単に言うと、Web ブラウザーに新しいセキュリティ システムを統合するために、Web サイトの一般的なセッション中にアクセスされるものを見つける必要があります。私の目的は、どのオブジェクトがどのようにアクセスされたか (読み取り、書き込み、実行) のログのようなものを取得することです。例: window.alert (x) window.foo.bar (w) ... なぜ変数の名前が必要なのですか? 多分あなたは別の考えを持っていますか?

前もって言っておくと、これは一般的にかなりトリッキーです。利用可能なオプションがいくつかありますが、どれもやや難しいものです。

  1. クールな新しいデバッガー オブジェクト APIまたは jsdbgapi.cpp (firebug が使用する複雑でやや大雑把なインターフェイス) を介して、デバッグ API を使用します。デバッガー機能を使用して、すべてのプロパティ アクセス、関数呼び出し、およびローカル参照をトラップして、オブジェクトの興味深いプロパティをダンプできます。
  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]};

これらfooの s はすべて、まったく同じ foo になりました。あなたはどちらを取り戻したいですか?あいまいすぎてあまり役に立たないため、そのための API 呼び出しはありません。

ただし、値を保持しているグローバル変数の1 つを本当に見つけたい場合は、グローバル オブジェクトのキーを反復処理して値をテストすることができます。

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

これを API 呼び出しに変換するか、関数に入れてAPI介して呼び出す必要があります。

より単純で直接的な解決策は、後で foo をどうしたいかを把握し、それを行うコールバック関数 (たとえばJS_CallFunction ) を渡すことです。

tl;dr:前の段落。

于 2010-10-13T19:07:55.027 に答える