最初に理解する必要があるのは、呼び出しチェーンです。問題の行を見てみましょう:
var elem = foo_plug.array_p[index];
これが行うことは、最初に、文字列「array_p」に変換されるNPIdentifierを使用してfoo_plugのNPObjectでNPN_GetPropertyを呼び出すことです。
次に何が起こるかは、返されるものによって異なります。文字列を返す場合、indexはその文字列へのインデックスになります。intの場合、エラーが発生します。一方、それがNPObjectの場合、次の呼び出しは、そのNPObjectでのNPN_GetPropertyであり、NPIdentifierはIntIdentifier(NPN_GetIntIdentifierを使用)または文字列としての番号を持つ文字列識別子(NPN_IdentifierIsStringを使用してどちらかを判別)のいずれかになります。 。
これで、返されるNPObjectが実際のjavascript配列である場合、それについて心配する必要はありません。ウィンドウのNPObjectを取得し、識別子「Array」を指定して引数なしでInvokeを呼び出すと、空の配列を持つNPObjectが返されます。あなたはそれに物を入れてそれを返すためにそれで働くことができます、そしてそれはうまくいくでしょう。
または、「長さ」プロパティNPN_Enumerateをサポートし、数値の文字列識別子または識別子のいずれかをインテリジェントに処理できるNPObjectを返すことができます(実際には、一部のブラウザは各タイプを使用するため、両方を処理する必要があります)。おそらく違いがわからないjavascript配列。
FireBreathは、これらすべてのオプションを優れた方法でサポートしています。