我有这段代码:
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的enumerable属性定义为false。但是当我在构造中使用'this.foo'时,属性会改变它。
我知道我可以加入构造函数:
Object.defineProperty(this,'foo',{enumerable:false,writable:true});
我的新输出正确抛出:
Obj {}
但是,我的问题是,是否可以更改foo的属性,而不是在构造函数中更改它?
谢谢!
答案 0 :(得分:1)
我的问题是,是否可以更改foo的属性,而不是在构造函数中更改它?
答案简短:不。
那是因为每次调用构造函数并执行this.foo = "foo";
时,您都会创建一个 new 属性。您在Obj.property
和Obj
上创建的属性实际上完全不相关。它们是完全独立的属性,在不同的对象上定义,而不是this
。
只需更密切地关注Obj
和obj
:
您可以看到三个不同的foo
属性,我注意到哪些操作会创建它们。希望这更清楚地说明为什么设置Obj.foo
或Obj.prototype.foo
的可枚举性对obj.foo
没有影响。
this.foo = "foo";
创建一个可枚举的属性。如果您不希望它是可枚举的,那么您必须使用Object.defineProperty
创建它。同样,您在Obj
和Obj.prototype
上创建的属性与您在this
上创建的属性无关。