我在 GWT 中尝试通过 JSNI 使用某些对象时遇到了一个奇怪的问题。假设我们有一个定义了函数的 javscript 文件:

测试.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"
  • 如何传递这些对象以便正确识别它们?
  • 最佳答案

    instanceof 不应该在您的示例 中一直返回 false 除非 您正在测试来自不同窗口的对象,因为来自一个窗口的数组不是不同窗口的 Array 构造函数的实例。

    当您需要测试特定事物并且您在一个窗口内操作时,使用 instanceof 非常有用(您必须了解 scunliffe 指出的字符串原语与字符串对象的关系)。请注意,您需要注意您的订单,因为数组是一个 instanceof Object (以及 Array );这也适用于 String 和所有其他对象。

    有一个没有窗口问题的替代方案,如果您正在执行调度,它可以很容易地用于 switch 语句等:

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

    这看起来很奇怪,但它所做的是在 toString 原型(prototype)上使用 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 实例,您都会得到这些结果。

    关于GWT 中的 Javascript instanceof & typeof (JSNI),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2943805/

    10-12 15:08