如解釋here,解決方法是將包裝的Java對象的原型設置爲new NativeObject()
。請注意,在鏈接線程中,沒有任何權威人員確認這實際上是正確的,因此可能會發生,以便爲您的用例工作並打破其他用例。
總之,要設置原型在Java端最好的地方是在一個自定義wrapFactory
:
cx.setWrapFactory(new WrapFactory() {
@Override public Object wrap(Context cx, Scriptable scope, Object obj, Class<?> staticType) {
final Object ret = super.wrap(cx, scope, obj, staticType);
if (ret instanceof Scriptable) {
final Scriptable sret = (Scriptable) ret;
if (sret.getPrototype() == null) sret.setPrototype(new NativeObject());
}
return ret;
}
});
,並在JavaScript端這將現在的工作:
var test = new java.util.ArrayList();
test.x = 'a';
所以,相比到您發佈的嘗試,您需要反轉對象和原型的角色。
一件有趣的事情:現在你可以在JavaScript端的原型以及自由設置:
test.prototype = {};
這聽起來像一個犀牛的錯誤給我,或者至少提高一個點。
爲什麼不只是'var test = new java.util.ArrayList();'? – Andremoniy
@Andremoniy我正在尋找一種將更多屬性添加到Java對象的方法。 –