[英]After Object.create: properties are there, but Object.keys / getOwnPropertyNames = []?
[英]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 literal
在Object.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
,该值将作为属性的描述 。 这确定属性是否可枚举等。
是,有一点不同。 创建对象文字时,无法设置像这样的enumerable
, writable
和writable
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.