2017-03-07 104 views
0
Object.keys(Object.create({a:1})) 
[] 

我期待["a"]的結果。你如何使用Object.prototype/Object.create來確保生成的對象有其預期的鍵?從Object.create獲取密鑰

+1

您可能想要使用Object.keys(Object.assign({},{a:1}))''。在這種情況下,Object.assign會將鍵複製到空對象。 – Mako

回答

0

對象中要傳遞一個空對象{}作爲第一個參數,作爲原型,以及之後的一系列對象,哪些屬性將被複制到結果對象中。

此外,每個屬性都有被標記(至少)爲枚舉它在Object.keys來電顯示

Object.keys(Object.create({}, {a:{value:1, enumerable:true}})) 

這在the documentation解釋使用propertiesObject大吵的Object.create()段落

+0

爲什麼這是低調?感謝您提供'enumerable' – AJP

1

你正確使用Object.create但請注意,這種方法創建一個具有指定原型對象的新對象和Object.keys僅返回自己的對象的屬性(所以yopur情況下a屬性在返回的對象的原型不是對象本身設置) (在原型上設置的屬性不被考慮)。

您還可以使用其他propertiesObject作爲Object.assign中的第二個參數,此對象的屬性將直接設置在返回的對象上。例如:

var o = Object.create({a: 'test'}, {b: {value: 'lorem', enumerable: true}}) 

在上面的代碼a屬性上o對象protoype限定,而b丙直接定義在其上,以便Object.keys(o)將返回['b']

在你的情況,你可以使用這樣的(空的對象作爲第一個參數):

Object.create({}, {b: {value: 'lorem', enumerable: true}}); 

但genarlly它不會使培訓就業處,因爲你可以使用對象文本,而無需使用Object.assign

Object.keys({a:1}) 

As @AJP提到: Object.create實際上僅用於定義getter/setter,原型繼承等的更高級用例。

+0

@RobG當然你是對的。回答已更新。謝謝! –

+0

這仍然只是部分錯誤,您可以通過將屬性對象傳遞給Object.create'調用來爲對象本身添加屬性,如果配置正確,那麼將從Object.keys'調用中顯示這些屬性 – alebianco

+0

@alebianco yes you必須使用類似於:'Object.create(null,{a:{value:1}})''''我猜Object.create實際上只用於定義getter/setter,原型繼承等的更高級用例。 – AJP

1

那是因爲什麼是你Object.keys()是繼承{a:1} 所以a是不是自己該對象的屬性,因此鍵將返回一個空數組