我有这个代码:
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 的属性一次而不是在构造函数中更改它?
谢谢!
最佳答案
my question is if is possible to change once the property of foo and not change it in the constructor?
简短的回答:不。
这是因为每次调用构造函数并执行 this.foo = "foo";
时,您都会创建一个新属性。您在 Obj.property
和 Obj
上创建的属性实际上完全不相关。它们是完全独立的属性,定义在不同的对象上,而不是 this
。
只需更仔细地看看 Obj
和 obj
:
您可以看到三个不同的 foo
属性,我注意到哪些操作创建了它们。希望这可以更清楚地说明为什么设置 Obj.foo
或 Obj.prototype.foo
的可枚举性对 obj.foo
没有影响。
this.foo = "foo";
创建一个可枚举属性。如果您不希望它是可枚举的,那么您必须使用 Object.defineProperty
创建它。同样,您在 Obj
和 Obj.prototype
上创建的属性与您在 this
上创建的属性无关。
关于javascript - JS : Object Properties Change in Constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46255598/