2014-09-06 136 views
-2

使用Object.create(someObject)方法創建對象時,原始方法的屬性不是由創建的方法派生的。如何使它派生現有的屬性。?Object.create(someObject)函數不會繼承屬性

> a = {} 

> a.p1 = '8'; // add a property to object 

> b = Object.create(a); 

> b // b does not inherit the property p1. 
{} 

重現錯誤使用節點控制檯,如下所示:

$ node 
> a = {} 
{} 
> a.p1 = 2; 
2 
> b = Object.create(a); 
{} 
> b 
{} 
> a 
{ p1: 2 } 
> 
+1

你是不正確見雛形;對象b將繼承p1。我可以證明它是我的瀏覽器控制檯;也許你的語法不正確,當你嘗試了這一點? – 2014-09-06 20:33:17

+0

$ node > a = {} {} > a.p1 = 2; > b = Object.create(a); {} > b {} >一個 {P1:2} > – 2014-09-06 20:34:36

+0

奇怪了,我可以再現OP的問題。 – idmean 2014-09-06 20:35:15

回答

3

有沒有錯誤都工作正常。從MDN

的的Object.create()方法創建具有指定原型對象和屬性的新對象。

該對象是使用原型創建的,但原型從未顯示在節點(以及我知道的任何瀏覽器控制檯)中。您可以通過使用b.__proto__

enter image description here

+0

只是好奇。大約5分鐘前,您曾認爲重現問題很奇怪,這意味着您不知道答案。你是如何設法快速找到答案的? – 2014-09-06 20:48:42

+0

@Talespin_Kit在節點控制檯中試用後,我檢查了MDN文檔,以確保我記住了Object.create所做的事情。在那裏我才意識到它從原型創建了一個對象。所以我試圖展示原型,並確實有效。 – idmean 2014-09-06 20:50:35

3

原型屬性將不被打印到控制檯字符串表示的一部分。

您可以驗證b.p1的確可以稱爲和相應的值是2

您也可以嘗試打印b.__proto__這給{ p1: 2 }

+0

b.p1打印出2. – 2014-09-06 20:45:24

+0

'JSON.stringify(b)'給出了{{}'as那麼...... – 2014-09-06 20:47:06

+2

是的。 JSON.stringify不序列化原型屬性 - 已經有一個相關的SO問題:http://stackoverflow.com/questions/12369543/why-is-json-stringify-not-serializing-prototype-values接受的答案有鏈接ES規格。 – lorefnon 2014-09-06 20:58:32