【问题标题】:Returning a host object in Rhino在 Rhino 中返回一个宿主对象
【发布时间】:2010-10-15 12:41:24
【问题描述】:

在 Rhino 中将宿主对象返回给 JavaScript 的最佳方式是什么?我有两个这样的课程:

public class Hosted extends org.mozilla.javascript.ScriptableObject {
    private static final long serialVersionUID = 1;
    public Hosted() {}
    public void jsConstructor() {}

    public String getClassName() {
        return "Hosted";
    }

    public Member jsGet_member() {
        Member m = new Member();
        m.defineFunctionProperties(new String[] { "toString" }, m.getClass(), DONTENUM);
        return m;
    }
}

public class Member extends org.mozilla.javascript.ScriptableObject {
    private static final long serialVersionUID = 2;
    public Member() {}
    public void jsConstructor() {}

    public String getClassName() {
        return "Member";
    }

    public String toString() {
        return "called toString()";
    }
}

它有效,因为我可以调用 toString 方法,但成员对象的行为与我预期的不同:

js> defineClass("Hosted");
js> defineClass("Member");
js> var h = new Hosted();
js> h.toString();
[object Hosted]
js> h instanceof Hosted;
true
js> h.__proto__;
[object Hosted]
js> 
js> var m = h.member;
js> m.toString();
called toString()
js> m instanceof Member; // Should be true
false
js> m.__proto__; // Should be [object Member]
null

如果我打电话给Object.prototype.toString,它确实说它是一个成员对象:

js> Object.prototype.toString.call(m);
[object Member]

我试过打电话给m.setPrototypeContext.javaToJS

【问题讨论】:

    标签: java javascript rhino host-object


    【解决方案1】:
        public Scriptable jsGet_member() {
            Scriptable scope = ScriptableObject.getTopLevelScope(this);
            Member m = new Member();
            m.setParentScope(scope);
            // defineClass("Member") must have previously been called.
            m.setPrototype(ScriptableObject.getClassPrototype(scope, "Member"));
            m.defineFunctionProperties(new String[] { "toString" },
                    m.getClass(), DONTENUM);
            return m;
        }
    

    js> defineClass("Member")
    js> defineClass("Hosted")
    js> var h = new Hosted();
    js> var m = h.member;
    js> m.toString();
    called toString()
    js> m instanceof Member;
    true
    js> m.__proto__;
    [object Member]
    

    编辑:方法也可以写:

        public Scriptable jsGet_member() {
            Scriptable scope = ScriptableObject.getTopLevelScope(this);
            Context cx = Context.getCurrentContext();
            Member m = (Member)cx.newObject(scope, "Member");
            m.defineFunctionProperties(new String[] { "toString" },
                    m.getClass(), DONTENUM);
            return m;
        }
    

    这将调用 Member.jsConstructor;可能还有其他差异。

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多