是否可以将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实例作为原型?
答案 0 :(得分:4)
它可能在Rhino中有效,因为在Rhino中,所有bean在暴露给JS程序之前都被包装到JS本机对象中。 Nashorn OTOH不会创建包装器。但是,您可以使用Nashorn的非标准Object.bindProperties
将一个对象的属性添加到另一个对象,并将其绑定到原始对象的实例。这基本上就像你可以得到的那样接近(好吧,它非常接近)一个包装器。确切的说明是:
Object.bindProperties(dst, src)
从src
对象中的所有属性创建绑定属性,将它们放入dst
对象,并返回dst
对象。由于属性绑定到src
,dst.foo
会将src.foo
委托给其值。 bindProperties
已经过专门编码,因此可以将普通Java对象作为src
来处理。
考虑到这一点,我相信如果你改变了行
F.prototype = hans;
到
F.prototype = Object.bindProperties({}, hans);
你会得到你想要的。这也适用于Object.create
,例如Object.create(Object.bindProperties({}, somePojo))
。