3

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です。

4

1 に答える 1

1

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

これは私には Rhino のバグのように思えますが、少なくとも改善すべき点です。

于 2013-07-11T13:55:30.977 に答える