从Object.create获取密钥

时间:2017-03-07 13:16:03

标签: javascript object prototype

Object.keys(Object.create({a:1}))
[]

我期待结果为["a"]。如何使用Object.prototype / Object.create来确保生成的对象具有预期的键?

3 个答案:

答案 0 :(得分:1)

您正确使用Object.create但请注意,此方法使用指定的原型对象创建一个新对象(因此在yopur case a属性设置在返回的对象原型上而不是对象本身)并且Object.keys仅返回自己的对象属性(不考虑原型上设置的属性)。

您还可以在propertiesObject中使用其他Object.assign作为第二个参数,并且此对象的属性将直接在返回的对象上设置。例如:

var o = Object.create({a: 'test'}, {b: {value: 'lorem', enumerable: true}})
上面代码a中的

属性在o对象原型上定义,而b道具直接在其上定义,因此Object.keys(o)将返回['b']

在你的情况下你可以使用这样的东西(空对象作为第一个参数):

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

但是因为你可以在不使用Object.assign的情况下使用对象文字,所以它并不存在:

Object.keys({a:1})

正如@AJP所说: Object.create实际上仅对定义getter / setter,原型继承等的更高级用例有用。

答案 1 :(得分:1)

那是因为Object.keys()中的内容是继承{a:1}的对象 所以a不是该对象的自有属性,因此键将返回一个空数组

答案 2 :(得分:0)

您应该传递一个空对象{}作为第一个参数,作为原型,然后传递一个对象数组,这些属性将被复制到结果对象中。

此外,每个属性都必须(至少)标记为可枚举,以便在Object.keys调用中显示

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

使用带有Object.create()段落的段

段的参数中的the documentation中对此进行了解释