2017-09-16 107 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」是三個完全獨立的屬性。 –