Javascript 为什么即使enumerable设置为true,添加了defineProperty的属性仍不显示?

Javascript 为什么即使enumerable设置为true,添加了defineProperty的属性仍不显示?,javascript,class,object,properties,Javascript,Class,Object,Properties,我不明白为什么不显示财产“工资”,尽管可以列举: class People { constructor(name, age) { this.name = name; this.age = age; } } Object.defineProperty(People.prototype, 'salary', { value: 3000, enumerable: true, writable: true }); 执行: >

我不明白为什么不显示财产“工资”,尽管可以列举:

class People {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}
Object.defineProperty(People.prototype, 'salary', {
    value: 3000,
    enumerable: true,
    writable: true
});
执行:

> var p = new People('Jack', 46);
> console.log(p)
People { name: 'Jack', age: 46 }
> console.log(p.propertyIsEnumerable('salary'));
false
> console.log(p.salary)
3000
为什么
p.propertyEnumerable('salary')
会显示false

但是,如果修改该属性,它会突然开始枚举:

> p.salary = 4500
4500
> console.log(p)
People { name: 'Jack', age: 46, salary: 4500 }
> console.log(p.propertyIsEnumerable('salary'));
true

发生什么事了?为什么它只有在修改后才成为可枚举的?为什么它不能从一开始就可枚举?

您使用的控制台只记录对象自身的属性值,而不是来自原型的属性值。这并不一定适用于所有控制台:

班级人员{
建造师(姓名、年龄){
this.name=名称;
这个。年龄=年龄;
}
}
Object.defineProperty(People.prototype,'salary'{
价值:3000,
可枚举:正确,
可写:对
});
var p=新人(“杰克”,46岁);

//与浏览器控制台进行比较
控制台日志(p)“与浏览器控制台比较”我刚刚做了(Firefox),相同result@ChennyStar它是否像StackSnippet控制台那样打印
{“name”:“Jack”,“age”:46,“salary”:3000}
?我做了更多的测试,你是对的,这是由于控制台的行为。JSBin和Chrome显示原型属性(即,它们显示{“name”:“Jack”,“age”:46,“salary”:3000}),但Node REPL和Firefox不显示(即,它们显示{“name”:“Jack”,“age”:46})。控制台在“它们记录东西”之外没有定义良好的行为。当涉及到对象时,您可能只获得自己的属性或所有内容,并且可能正在记录该对象。+1,我刚刚更新了您的答案,但没有显示出来(我的声誉不到15)。谢谢你的帮助