Java对象可以成为Nashorn中JavaScript对象的原型吗?

时间:2014-12-28 10:11:00

标签: java javascript nashorn

是否可以将Java对象作为JavaScript对象的原型?如下所示:

var Person = Java.type("Person");
var hans = new Person();
hans.name = "Hans";

var employeeFactory = function() {
    var F = function(){};
    F.prototype = hans;
    return new F();
};

var fritz = employeeFactory();
print(fritz.name);

这里Person是一个Java Bean。变量hans被设置为此Java类的实例。行hans.name =“Hans”按预期在Java对象中设置名称字段。但是当在工厂函数中创建对象fritz时,它不会链接到预期的原型。是否有任何理由不接受Java实例作为原型?

1 个答案:

答案 0 :(得分:4)

它可能在Rhino中有效,因为在Rhino中,所有bean在暴露给JS程序之前都被包装到JS本机对象中。 Nashorn OTOH不会创建包装器。但是,您可以使用Nashorn的非标准Object.bindProperties将一个对象的属性添加到另一个对象,并将其绑定到原始对象的实例。这基本上就像你可以得到的那样接近(好吧,它非常接近)一个包装器。确切的说明是:

Object.bindProperties(dst, src)

src对象中的所有属性创建绑定属性,将它们放入dst对象,并返回dst对象。由于属性绑定到srcdst.foo会将src.foo委托给其值。 bindProperties已经过专门编码,因此可以将普通Java对象作为src来处理。

考虑到这一点,我相信如果你改变了行

F.prototype = hans;

F.prototype = Object.bindProperties({}, hans);

你会得到你想要的。这也适用于Object.create,例如Object.create(Object.bindProperties({}, somePojo))