2014-03-24 28 views
2

我需要一種方法來創建一個空的對象,其原型鏈是作爲對象的數組:如何用給定的原型鏈創建對象?

var prototypes = [{one: 1}, {two: 2}, {three: 3}]; 
var created = create(prototypes); 
// prototype chain of created should be: 
// created --> {one: 1} --> {two: 2} --> {three: 3} 

我怎樣才能做到這一點?

+0

我不明白downvote。問題很明顯,答案不容易找到。 –

回答

2

您基本上不能(當前*),因爲只有一個原型鏈,原型當前只在創建對象時分配,但您有多個不相關的離散對象。也就是說,要創建鏈,需要鏈中的每個對象都由前一個支持,但那些對象不是。

什麼你可以要做的就是創建鏈拷貝這些對象的,但當然隨後對這些原始對象的變化不會在鏈中反映出來。

可以通過爲所有這些源對象,並同步他們的現有屬性的創建與getter和setter新對象獲得與密切ECMAScript5,但不會處理屬性(或刪除的文件),只是改變現有的屬性。


*我說:「目前」上面,因爲在未來的ECMAScript版本,ECMAScript的第6版,目前的規範草案有一個新的Reflect對象,必須設置一個現有對象的原型追溯的能力。 (而對於ECMAScript5及更早版本,您只能在創建對象時設置對象的原型。)因此,從ES6開始,您可以使用未來的​​方法將這些對象組裝成鏈。但現在,跨瀏覽器,你不能。

+0

'反映'?它不只是'Object.setPrototypeOf'? – Bergi

+0

@Bergi:兩者都在目前的草案中(2014年1月)。我沒有跟隨討論,但Harmony wiki中的[反映頁面](http://wiki.ecmascript.org/doku.php?id=harmony:reflect_api)說*「現在我們有模塊,一個」 @reflect「模塊對於之前在Object中定義的許多反射方法來說更加自然,爲了向後兼容的目的,'Object'上的靜態方法不會消失,但是可能會添加新的方法到「@reflect」模塊,而不是Object構造函數。「* –

+0

@Bergi:我想知道'Object.setPrototypeOf'會在未來的草稿中消失,因爲它不在ES5中,或者它們會保持平衡'Object.getPrototypeOf'(這是ES5將繼續存在)。 –

相關問題