Javascript JS:构造函数中的对象属性更改

Javascript JS:构造函数中的对象属性更改,javascript,node.js,properties,ecmascript-6,Javascript,Node.js,Properties,Ecmascript 6,我有以下代码: class Obj { constructor() { this.foo = "foo"; } } Object.defineProperty(Obj.prototype,'foo',{enumerable:false,writable:true}); Object.defineProperty(Obj,'foo',{enumerable:false,writable:true}); let obj = new Obj(); console.

我有以下代码:

class Obj {
    constructor() {
        this.foo = "foo";
    }
}

Object.defineProperty(Obj.prototype,'foo',{enumerable:false,writable:true});
Object.defineProperty(Obj,'foo',{enumerable:false,writable:true});

let obj = new Obj();

console.log(obj);
我的输出是:

Obj { foo: 'foo' }
问题是,我为foo将可枚举属性定义为false。但是当我在构造中使用'this.foo'时,该属性会改变它

我知道我可以输入构造函数:

Object.defineProperty(this,'foo',{enumerable:false,writable:true});
我的新输出正确抛出:

Obj {}
但是,我的问题是,一旦foo的属性发生变化,是否可以在构造函数中不改变它

谢谢

我的问题是,是否可以更改foo的属性一次,而不在构造函数中更改它

简单的回答是:没有

这是因为每次调用构造函数时,
this.foo=“foo”时,您正在创建一个新属性。在
Obj.property
Obj
上创建的属性实际上完全不相关。它们是完全独立的属性,定义在不同的对象上,而不是

只需更仔细地查看
Obj
Obj

您可以看到三个不同的
foo
属性,我注意到是哪些操作创建了它们。希望这能更清楚地说明为什么设置
Obj.foo
Obj.prototype.foo
的可枚举性对
Obj.foo
没有影响



this.foo=“foo”创建可枚举属性。如果您不希望它是可枚举的,那么您必须使用
Object.defineProperty
来创建它。同样,您在
Obj
Obj.prototype
上创建的属性与您在
this

上创建的属性无关。您试图实现什么?我只尝试更改一次对象的属性。当我创建一个新对象时,最好的情况是:更改构造函数中的属性?是的,你必须按照你想要的方式创建属性。正如我所说,
Obj.foo
Obj.prototype.foo
this.foo
是三个完全独立的属性。