3

GWTでJSNIを介していくつかのオブジェクトを使用しようとしたときに、奇妙な問題が発生しました。関数が定義されたjavscriptファイルがあるとしましょう。

test.js:

function test(arg){
  var type = typeof(arg);
  if (arg instanceof Array)
    alert('Array');
  if (arg instanceof Object)
    alert('Object');
  if (arg instanceof String)
    alert('String');
}

そして、この関数をユーザーJSNIと呼びたいと思います。

public static native void testx()/ *-{
  $wnd.test( new Array(1, 2, 3) );
  $wnd.test( [ 1, 2, 3 ] );
  $wnd.test( {val:1} );
  $wnd.test( new String("Some text") );
}-*/;

質問は次のとおりです。

  • なぜinstanceof命令は常に返されるのfalseですか?
  • なぜtypeof常に戻るの"object"ですか?
  • それらが正しく認識されるようにこれらのオブジェクトを渡す方法は?
4

3 に答える 3

7

instanceofあるウィンドウの配列は別のウィンドウのコンストラクターのインスタンスではないため、別のウィンドウのオブジェクトをテストしている場合を除いて、例では常にfalseを返す必要はありません。Array

特定のことをテストする必要があり、1つのウィンドウ内で操作している場合は、使用するinstanceofのが最適です(scunliffeが指摘した文字列プリミティブと文字列オブジェクトの違いに注意する必要があります)。instanceof Object配列は(および)であるため、順序に注意する必要があることに注意してくださいArray。これは、Stringsおよび他のすべてのオブジェクトにも適用されます。

switchウィンドウの問題がなく、ディスパッチを実行している場合にステートメントなどに簡単に使用できる代替手段があります。

function classify(arg) {
    return Object.prototype.toString.call(arg);
}

奇妙に見えますが、動作が定義されているプロトタイプのtoString関数を使用Objectします(テストしている実際のオブジェクトが持つ可能性のあるオーバーライドを使用するのではなく、動作が異なる可能性があります)。したがって、この関数が与えられます:

function show(arg) {
    alert(classify(arg));
}

次の結果が得られます。

show({});               // [object Object]
show("a");              // [object String]
show(new String("a"));  // [object String]
show([]);               // [object Array]
show(/n/);              // [object RegExp]
show(function() { });   // [object Function]

テストしているオブジェクトがどのウィンドウから来ているかに関係なく、また文字列プリミティブを使用するかStringインスタンスを使用するかに関係なく、これらの結果が得られます。

于 2010-05-31T13:51:27.787 に答える
1

他のすべてが答えられたように見えるので、これを手に入れましょう:

それらが正しく認識されるようにこれらのオブジェクトを渡す方法は?

GWTは、文字列、整数などのプリミティブ型に対してこれを自動的に実行します。したがって、次のように記述できます。

public static native String test1()/ *-{
   return "adfasdf";
}-*/;

public static native int test2()/ *-{
   return 23;
}-*/;

いくつかの追加の注意事項については、ドキュメントを参照してください。

配列の場合JsArray、ラッパークラスがたくさんあります:、、、、、。JsArrayBooleanJsArrayIntegerJsArrayNumberJsArrayString

public static native JsArrayString test3()/ *-{
   return ['foo', 'bar', 'baz'];
}-*/;
于 2010-05-31T22:36:21.243 に答える
0

returnステートメントを指定しないため、テスト関数は常にfalseを返します String...JavaScriptではおかしいです...使用するnew String("asdf");場合はinstanceofを使用できますが、文字列を作成する場合"asdf"はtypeofを使用する必要があります。

function test(arg){
  if (arg instanceof Array){
    return 'Array';
  } else if(arg instanceof String || typeof(arg) == 'String'){
    return 'String';
  } else if (arg instanceof Object){
    return 'Object';
  } else {
    return typeof(arg);
  }
}

(他のタイプがあることに注意してください...日付、数、カスタムオブジェクトなど)

于 2010-05-31T13:30:04.003 に答える