2016-10-10 103 views
0

我想是觸發類屬性的設置:Setter/getter類屬性(Object.assign)?

class Example { 
    prop = { default: 'default', color: 'red' }; 

    set prop(value) { 
     // this.prop will be undefined as the setter overrides the class property) 
     Object.assign(this.prop, value); 
    } 
} 

const myExample = Example(); 
myExample.prop.default = 'new'; 

// Trying to get prop = { default: 'new', color: 'red' } 

setter方法將覆蓋支柱,我相信,我怎麼會指定一個默認的對象值?我應該像_prop一樣存儲類屬性prop嗎?

+0

添加一個相應的getter並將其存儲在名稱不同的屬性中。 – zerkms

+0

@zerkms謝謝,我剛剛用這個解決方案編輯了我的問題:)有沒有更簡潔的方法來做到這一點,或者這是正確的方法?我一直在閱讀Object.defineProperty,但不知道這是否是正確的解決方案。 –

+0

類只允許方法定義。不是數據屬性。 – Oriol

回答

2

我將手動在構造函數中定義的訪問者:

class Example { 
 
    constructor() { 
 
    var prop = { default: 'default', color: 'red' }; 
 
    Object.defineProperty(this, 'prop', { 
 
     get() { return prop; }, 
 
     set(value) { Object.assign(prop, value); } 
 
    }); 
 
    } 
 
} 
 
const myExample = new Example(); 
 
console.log(myExample.prop); 
 
myExample.prop = {foo: "bar"}; 
 
console.log(myExample.prop);

如果你不介意prop是公開的,你可以移動的構造外的存取,而其中分享所有情況:

class Example { 
 
    constructor() { 
 
    this._prop = { default: 'default', color: 'red' }; 
 
    } 
 
    get prop() { return this._prop; } 
 
    set prop(value) { Object.assign(this._prop, value); } 
 
} 
 
const myExample = new Example(); 
 
console.log(myExample.prop); 
 
myExample.prop = {foo: "bar"}; 
 
console.log(myExample.prop);

+0

與使用類屬性相比,這種方法的優點是什麼?我真的不喜歡把大量的東西放在構造函數中。 –

+0

@JohnSmith因爲你必須將數據存儲在某個地方,而類定義只允許方法定義,而不是數據屬性。不過,您可以將構造函數之外的訪問器移出。 – Oriol

+0

好的,但是試着理解我爲這個項目使用類屬性,這不像我要切換一切,因爲某些東西還沒有被標準化。這種方法的優點是什麼? –