Rhino中作为原型的Java对象
我在使用Java对象作为JavaScript原型时遇到困难。这说明了我的问题:Rhino中作为原型的Java对象,java,javascript,rhino,Java,Javascript,Rhino,我在使用Java对象作为JavaScript原型时遇到困难。这说明了我的问题: var test = {}; test.prototype = new java.util.ArrayList(); test.prototype.add(1); // works test.add(1); // fails 在我看来,这种情况永远不会发生:在原型上可访问的任何函数属性都必须在对象本身上可访问 我的目标是向包装好的Java对象添加更多函数属性。Rhino是否至少有一种变通方法可以
var test = {};
test.prototype = new java.util.ArrayList();
test.prototype.add(1); // works
test.add(1); // fails
在我看来,这种情况永远不会发生:在原型上可访问的任何函数属性都必须在对象本身上可访问
我的目标是向包装好的Java对象添加更多函数属性。Rhino是否至少有一种变通方法可以达到预期效果?约束条件是属性的添加必须在JavaScript端完成
我的Rhino是1.7R4。如前所述,解决方法是将包装好的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端自由设置原型:
test.prototype = {};
这听起来像是一个Rhino bug,或者至少是需要改进的地方。为什么不干脆
var test=new java.util.ArrayList()
?@Andremoniy我正在寻找一种向Java对象添加更多属性的方法。new NativeObject()
与JS中的{}
不完全相同。缺少的是它的默认原型对象
。考虑这一点:<代码> NATIVE对象原型=新的NATIVEObjor();setPrototype(ScriptableObject.getObjectPrototype(范围));sret.setPrototype(prototype)代码>区别在于,例如:没有prototype的NativeObject没有默认的toString()实现。因此,尝试在某个地方打印会导致错误。
test.prototype = {};