【问题标题】:Get keys from Object.create从 Object.create 获取密钥
【发布时间】:2017-03-07 13:16:03
【问题描述】:
Object.keys(Object.create({a:1}))
[]

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

【问题讨论】:

  • 您可能想使用Object.keys(Object.assign({}, {a:1}))。在这种情况下,Object.assign 会将键复制到一个空对象。

标签: javascript object prototype


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您正确使用了Object.create,但请注意,此方法使用指定的原型对象创建一个新对象(因此在 yopur 情况下,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、原型继承等更高级的用例有用。

    【讨论】:

    • @RobG 当然你是对的。答案已更新。谢谢!
    • 这仍然只是部分正确,您可以通过将属性对象传递给 Object.create 调用来将属性添加到对象本身,如果配置正确,这些将显示在 Object.keys 调用中跨度>
    • @alebianco 是的,你必须使用类似的东西:Object.create(null, {a:{value:1}}) 我猜 Object.create 真的只对定义 getter/setter、原型继承等更高级的用例有用。
    • @AJP 是的,那是他的工作。另外,在编辑之后,那行代码Object.keys(Object.create({}, {a:1})) 是无效的,会导致运行时错误
    • 答案再次更新。谢谢大家的cmets和帮助。
    【解决方案3】:

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

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

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

    这在the documentation 中的Using propertiesObject 参数与 Object.create() 段落中进行了解释

    【讨论】:

    • 为什么这被否决了?感谢enumerable 的提醒
    猜你喜欢
    • 2018-02-08
    • 2012-03-14
    • 1970-01-01
    • 2013-03-17
    • 2020-06-09
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多