Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rhino中作为原型的Java对象_Java_Javascript_Rhino - Fatal编程技术网

Rhino中作为原型的Java对象

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是否至少有一种变通方法可以

我在使用Java对象作为JavaScript原型时遇到困难。这说明了我的问题:

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 = {};