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