4

Rhino はScriptableインターフェイスとScriptableObjectヘルパー クラスを提供して、Java オブジェクトに基づく JavaScript オブジェクトを実装します。

ScriptableObjectが構築されると、名前が jsFunction___ 、 jsStaticFunction___ 、 jsGet___ 、 jsSet___ 、 jsConstructor で始まるメソッドが javascriptオブジェクトに対して自動的定義ます。このようにして、関数、静的関数、インスタンス プロパティ (アクセサーによる)、およびコンストラクターを定義できます。

問題は、静的プロパティを定義する方法です。

静的プロパティとは、静的メソッドがコンストラクターのメソッドであるように、コンストラクターのプロパティを意味します。

今のところ唯一の方法は、finishInitメソッドを使用し、静的プロパティを手動で定義することです。しかし、正しい方法は何ですか?

4

1 に答える 1

3

現在、私は次のようなことを考えています。

public class MyObject extends ScriptableObject {

@Override
public String getClassName() {
    return "MyObject";
}

// define static properties
public static void finishInit(Scriptable scope, FunctionObject ctor, Scriptable proto) {
    ctor.defineProperty("PROP_ONE", 1, READONLY);
    ctor.defineProperty("PROP_TWO", 2, READONLY);
    ctor.defineProperty("PROP_THREE", 3, READONLY);
}

他の方法はありますか?そして、この方法は正しいですか?

重要: finishInitが呼び出されたとき、 MyObjectのコンストラクターはスコープ内でまだ定義されていないことに注意してください。MyObjectのインスタンスである静的プロパティを定義するには、次の構文を使用します。

public static void finishInit(Scriptable scope, FunctionObject ctor, Scriptable proto) {
    Context cx = Context.getCurrentContext();
    Scriptable myObjectInstance = ctor.construct(cx, scope, new Object[] { /* args */ });
    ctor.defineProperty("PROP", myObjectInstance, READONLY);
    ....
}
于 2009-08-06T07:38:13.060 に答える