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
是三个完全独立的属性。