我目前使用的是Rhino的javax實現。默認情況下,Rhino使用包裝來返回Java對象。 Nashorn是否具有類似的行爲或默認返回JavaScript對象?Nashorn是否返回本機JavaScript對象?
謝謝
我目前使用的是Rhino的javax實現。默認情況下,Rhino使用包裝來返回Java對象。 Nashorn是否具有類似的行爲或默認返回JavaScript對象?Nashorn是否返回本機JavaScript對象?
謝謝
看起來像它盡最大努力返回明智的對象。使用此代碼,然後改變XXX:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("nashorn");
engine.eval("function test() { return XXX; };");
Object result = ((Invocable)engine).invokeFunction("test");
System.out.println(result.getClass().getName());
產量:
return 'hello world' = java.lang.String
return 1 = java.lang.Integer
return { name: 'Hello' } = jdk.nashorn.api.scripting.ScriptObjectMirror
貌似是,即使Java對象可以在JS代碼中使用,但它仍然引用Java對象(雖然它們顯示爲函數對象,所以必須有一個包裝有),我們不能把他們當作JavaScript對象:
//"import"
var StringTokenizer = java.util.StringTokenizer;
print(typeof StringTokenizer);
var st = new StringTokenizer("this is a test");
print(typeof st);
java.util.StringTokenizer.prototype.name = 'myST';
print(st.name);
而這裏的結果:
testObj.js:9 TypeError: Cannot set property "name" of undefined
現在,Javascript對象將作爲「jdk.nashorn.internal.scripts.JO」實例加載。
*如果你想更方便地測試上面的代碼,只爲您的JDK的jjs
(犀牛解釋)的別名,例如,如果你創建一個名爲test.js
文件,你可以運行程序:
$ jjs test.js
的Mac OS = alias jjs=’/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/jjs’
的Windows =定義一個名爲 'JAVA8_HOME' 並指向您jdk8文件夾,然後可以通過運行這個命令來調用JJS環境變量:
> 「%JAVA8_HOME%\jre\bin\jjs」 test.js