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

是否可以使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)).

上一篇:Java将选择哪个JS脚本引擎?


下一篇:Weka学习 -- StringToWordVector 源代码学习(1)