1

パブリックCJSAPIを使用してSpiderMonkey(最新リリースバージョン)のJavaScriptを調べようとしています。

for...inJS_GetPropertyById、JS_LookupProperty、JS_EnumerateなどのパブリックJSAPI呼び出しを使用してループの動作を複製するにはどうすればよいですか?JS_Enumerateのドキュメントには、ターゲットオブジェクトの列挙可能なプロパティのみが返されると記載されています。オブジェクトのプロトタイプチェーン内のプロパティは検索されません。ループの正確な動作を再現したいのfor...inですが、JS環境にコードを挿入することは避けてください。JS_NewPropertyIteratorが非推奨になっている可能性があるか、非推奨の有力な候補であるようです。

4

1 に答える 1

1

私の第一印象は、これはおそらく良いことではないということです。for...inの振る舞いは一種の奇妙で特異なものであり、それが正しいことだとは思わないので、これは私がこれまでに行うことではありません。しかし、これが本当にあなたが望むものであるならば、読み続けてください。

内部的には、実際のfor...inループはを使用しjs::ValueToIterator、その関数はJSAPIを介して公開されていないように見えます(少なくともjsapi.cppはそれをどこにも呼び出しません)。したがって、2つのオプションがあります。

  1. Mozilla JSチームにfor...in、JSAPIを介して機械を公開するように説得します(作業を支援する意思がある場合、これは実行可能です)。また

  2. 実際には、for...inループを含むJSコードをコンパイルします。

オプション2の方が速くなります。この関数は、次のように使用できます。

function ForInResults(obj) {
    return [v for (v in obj)];
}

または、イテレータを使用する場合:

function ForInIterator(obj) {
    for (var v in obj)
        yield v;
}

を使用してこれらの関数のいずれかをコンパイルしてJS_CompileFunctionから、を使用して呼び出すことができますJS_CallFunctionValue。配列から個々の要素を取得するには、とを使用JS_GetArrayLengthJS_GetElementます。イテレータから値を取得するのは少し難しいですが、for...inループ中にプロパティが追加または削除されるという珍しいケースでは、実際のループに似ています。

于 2012-10-02T20:19:19.040 に答える