2014-12-28 99 views
4

是否可以將Java對象作爲JavaScript對象的原型?如下所示:Java對象可以成爲Nashorn中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

我真的很驚訝,不起作用。 –

+0

只與切線相關,但Nashorn不支持'Object.create'嗎? –

+1

有趣的一點。 Nashorn不僅知道Object.create函數。如果我使用它而不是工廠,並嘗試創建一個JS對象,並將Java實例作爲原型,則會出現以下錯誤:TypeError:Person @ 73d4cc9e不是Object。這是一個真正的可憐。本來很好從Java bean繼承。 – Gregor

回答

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))

+0

感謝您的回覆。儘管我只對納什感興趣。但至少這給了我一些關於Nashorn「錯誤」的暗示。 – Gregor