3 回答
TA贡献1858条经验 获得超8个赞
您应该设置enumerable
为true
。在Object.defineProperty
其false
默认情况下。根据MDN的说法。
枚举
true
当且仅当该属性显示了相应的对象的属性的枚举期间。
默认为false。
不可枚举意味着该属性将不会在控制台中显示Object.keys()
或for..in
循环显示
let profile = {
name: 'Barry Allen',
}
// I added a new property in the profile object.
Object.defineProperty(profile , 'age', {
value: 23,
writable: true,
enumerable: true
})
console.log(profile)
console.log(profile.age)
prototype
内置类的对象的所有属性和方法都是不可枚举的。这就是您可以从实例中调用它们但它们在迭代时不出现的原因。
获取所有属性(包括不可枚举)Object.getOwnPropertyNames()
。
let profile = {
name: 'Barry Allen',
}
// I added a new property in the profile object.
Object.defineProperty(profile , 'age', {
value: 23,
writable: true,
enumerable: false
})
for(let key in profile) console.log(key) //only name will be displayed.
console.log(Object.getOwnPropertyNames(profile)) //You will se age too
TA贡献1859条经验 获得超6个赞
默认情况下,您使用定义的属性defineProperty
是不可枚举的-这意味着当您对其进行迭代时,这些属性将不会显示Object.keys
(这是代码段控制台所做的事情)。(类似地,由于length
无法枚举数组的属性,因此无法显示。)
参见MDN:
数不清的
当且仅当在枚举相应对象的属性时显示此属性时,才返回true。
默认为false。
使其可枚举:
//Code Snippet
let profile = {
name: 'Barry Allen',
}
// I added a new property in the profile object.
Object.defineProperty(profile, 'age', {
value: 23,
writable: true,
enumerable: true
})
console.log(profile)
console.log(profile.age)
您可以在记录的图像中看到该属性的原因是,Chrome的控制台也将向您显示不可枚举的属性-但不可枚举的属性将略显灰色:
看看age
灰色是多少,而name
不是灰色-这表明它name
是可枚举的,而age
不是。
TA贡献1946条经验 获得超4个赞
每当使用对象的“ .defineProperty”方法时。您最好定义描述符的所有属性。因为如果您不定义其他属性描述符,则它将假定所有属性描述符的默认值为false。因此,您的console.log检查所有可枚举的true属性,并将它们记录下来。
//Code Snippet
let profile = {
name: 'Barry Allen',
}
// I added a new property in the profile object.
Object.defineProperty(profile, 'age', {
value: 23,
writable: true,
enumerable : true,
configurable : true
})
console.log(profile)
console.log(profile.age)
添加回答
举报