繁体   English   中英

为什么object.keys()到Object常量和Object.create()的结果不同?

[英]why object.keys() to Object literal and Object.create() has different result?

mdn Object.keys()定义它将返回给定对象自己的可枚举属性的数组。

var USComicPublishers = {
countryOfOrigin : {
    value  : "USA",
    enumerable: false,
    writable: false,
    configurable: false
},
medium : {
    value  : "comic books",
    enumerable: true,
    writable: false,
    configurable: false
}
}

如Object.keys()所定义,它应返回['medium']

但它返回['countryOfOrigin', 'medium']

然后我使用Object.create()进行包装,它将返回['medium']

var us2 = Object.create({}, USComicPublishers)
console.log(us2)
// return ['medium']

Object literalObject.create()有不同的行为吗?

 var USComicPublishers = { countryOfOrigin : { value : "USA", enumerable: false, writable: false, configurable: false }, medium : { value : "comic books", enumerable: true, writable: false, configurable: false } } console.log(Object.keys(USComicPublishers)) var us2 = Object.create({}, USComicPublishers) console.log(Object.keys(us2)) console.log(Object.getOwnPropertyNames(us2)) 

给定对象文字- { foo: bar } bar是属性持有的 这是简单明了的价值。 它不能确定有关适当内容的任何信息 (例如是否可枚举)。

当传递给Object.create ,该值将作为属性描述 这确定属性是否可枚举等。

是,有一点不同。 创建对象文字时,无法设置像这样的enumerablewritablewritable configurable属性。 相反,您要在设置属性时将所有这些值都设置为true并且将value设置为要提供的值(在第一个示例中,您会注意到USComicPublishers.medium将是一个对象,而USComicPublishers.medium.value === "comic books"

如果需要相同的结果,则必须创建对象文字,然后使用Object.defineProperties应用属性。

 var USComicPublishersData = { countryOfOrigin : { value : "USA", enumerable: false, writable: false, configurable: false }, medium : { value : "comic books", enumerable: true, writable: false, configurable: false } } var USComicPublishers = {}; Object.defineProperties(USComicPublishers, USComicPublishersData); console.log(Object.keys(USComicPublishers)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM