2017-09-16 109 views
0

我有这样的代码:JS:对象属性变化构造

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的。但是当我在构造中使用'this.foo'属性改变它时。

我知道我可以把在构造函数中:

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

而且我的新的输出抛出正确:

Obj {} 

但是,我的问题是,如果有可能,一旦foo的属性改变,不在构造函数中更改它?

谢谢!

+0

你想达到什么目的? – philipp

+0

我试图只改变一次对象的属性。并且在创建新对象时不会更改 – jtwalters

回答

1

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

简短的回答:没有。

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

只要看看Objobj更加紧密:

enter image description here

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


this.foo = "foo";创建一个枚举属性。如果你不希望它是可枚举的,那么你必须用Object.defineProperty来创建它。同样,您在ObjObj.prototype上创建的属性与您在this上创建的属性无关。

+0

因此,最好的情况是:更改构造函数中的属性? – jtwalters

+0

是的,你必须创建你想要的属性。正如我所说的,“Obj.foo”,“Obj.prototype.foo”和“this.foo”是三个完全独立的属性。 –