java mozilla返回java对象,java-在Rhino中返回主机对象

在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,它会说这是一个Member对象:

js> Object.prototype.toString.call(m);

[object Member]

我试过调用m.setPrototype和Context.javaToJS.

解决方法:

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;可能还有其他差异.

标签:javascript,java,rhino,host-object

来源: https://codeday.me/bug/20191107/2004191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值