我在尝试通过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"
?答案 0 :(得分:7)
instanceof
不应该在示例中一直返回false,除非您正在测试来自不同窗口的对象,因为来自一个窗口的数组不是< / em>不同窗口的Array
构造函数的实例。
当你需要测试一个特定的东西并且你在一个窗口内操作时,使用instanceof
是很好的(你必须要知道scunliffe指出的字符串原语与String对象的东西)。请注意,您需要注意您的订单,因为数组是instanceof
Object
(以及Array
);这也适用于String
和所有其他对象。
有一个替代方案没有窗口问题,如果你正在发送,它可以很容易地用于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
实例,都可以获得这些结果。
答案 1 :(得分:1)
由于其他一切似乎都得到了回答,让我得到这个:
如何传递这些对象以便正确识别它们?
GWT会自动为字符串,整数等原始类型执行此操作。因此,您只需编写:
public static native String test1()/ *-{
return "adfasdf";
}-*/;
public static native int test2()/ *-{
return 23;
}-*/;
请参阅the docs了解一些额外的注意事项。
对于数组,有一堆包装类:JsArray
,JsArrayBoolean
,JsArrayInteger
,JsArrayNumber
,JsArrayString
。
public static native JsArrayString test3()/ *-{
return ['foo', 'bar', 'baz'];
}-*/;
答案 2 :(得分:0)
你的测试函数总是返回false,因为你没有提供return语句......并且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);
}
}
(注意还有其他类型......日期,数字,自定义对象等。)