JavaScript中Object.defineProperty()的奇怪行为

JavaScript中Object.defineProperty()的奇怪行为,javascript,Javascript,我在玩下面的javascript代码。理解Object.defineProperty(),我面临着一个奇怪的问题。当我尝试在浏览器或VS代码中执行下面的代码时,输出不是预期的,而如果我尝试调试代码,输出是正确的 当我调试代码并评估概要文件时,我可以在对象中看到name&age属性 但在输出时,它只显示name属性 //代码片段 let profile={ 姓名:“巴里·艾伦”, } //我在profile对象中添加了一个新属性。 Object.defineProperty(配置文件“年龄”{

我在玩下面的javascript代码。理解
Object.defineProperty()
,我面临着一个奇怪的问题。当我尝试在浏览器或VS代码中执行下面的代码时,输出不是预期的,而如果我尝试调试代码,输出是正确的

当我调试代码并评估概要文件时,我可以在对象中看到
name&age
属性 但在输出时,它只显示
name
属性

//代码片段
let profile={
姓名:“巴里·艾伦”,
}
//我在profile对象中添加了一个新属性。
Object.defineProperty(配置文件“年龄”{
价值:23,
可写:对
})
console.log(配置文件)

console.log(profile.age)
您应该将
可枚举
设置为
true
。默认情况下,在
Object.defineProperty
its
false
中。根据

可枚举的

true
当且仅当此属性在枚举相应对象上的属性时显示。

默认为false。

不可枚举意味着属性将不会显示在控制台中的
Object.keys()
for..in
循环中

let profile={
姓名:“巴里·艾伦”,
}
//我在profile对象中添加了一个新属性。
Object.defineProperty(配置文件“年龄”{
价值:23,
可写:对,
可枚举:true
})
console.log(配置文件)

console.log(profile.age)
默认情况下,使用
defineProperty
定义的属性不可枚举-这意味着当您迭代其
对象.keys
时,它们不会显示(这是代码段控制台所做的)。(类似地,数组的
length
属性也不会显示,因为它是不可枚举的。)

见:

可枚举的

当且仅当此属性在相应对象上的属性枚举期间显示时,为true

默认为false。

改为使其可枚举:

//代码片段
let profile={
姓名:“巴里·艾伦”,
}
//我在profile对象中添加了一个新属性。
Object.defineProperty(配置文件“年龄”{
价值:23,
可写:对,
可枚举:true
})
console.log(配置文件)
console.log(profile.age)
无论何时使用对象的.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)

我不知道这一点,但当我在浏览器中运行本地代码进行检查时,它显示得非常完美(尽管将
enumerable
显式指定为false)。@randomSoul我无法理解您的意思。请参阅-。对于
年龄
我没有将
可枚举的
设置为true,但它仍然显示。@randomSoul在Chrome控制台中,您应该可以看到不可数属性的颜色有点透明。@randomSoul这是调试功能,不是语言功能。如果您将示例更改为使用
JSON.stringify
,它的行为将保持一致,并省略不可枚举的
属性。有人在chrome控制台中将此属性指定为showing
age
属性。你能解释一下吗?chrome控制台的工作方式不同吗?是的,这是chrome控制台的行为-它将显示所有属性,包括不可枚举的属性,请参见编辑。不可枚举属性(如
age
\uuuuu proto\uuuu
)将略微变灰。