2016-06-30 48 views
7

Örnek değişkenleri normal değişkenlere nasıl yapabildiğinize benzer şekilde atamak için bir JavaScript sınıfının yapıcısındaki yıkıcı atamayı kullanmak mümkün mü?JavaScript kurgusunda örnek/üye değişkenlerini yıkmak mümkün mü?

var options = {one: 1, two: 2}; 
var {one, two} = options; 
console.log(one) //=> 1 
console.log(two) //=> 2 

Ama işe aşağıdaki gibi bir şey elde edemez:

Aşağıdaki örnek çalışır

class Foo { 
    constructor(options) { 
    {this.one, this.two} = options; 
    // This doesn't parse correctly and wrapping in parentheses doesn't help 
    } 
} 

var foo = new Foo({one: 1, two: 2}); 
console.log(foo.one) //=> I want this to output 1 
console.log(foo.two) //=> I want this to output 2 
+2

Daha düşünüyorum:

class Foo { constructor(options) { const {one, two} = options; Object.assign(this, {one, two}); // Do something else with the other options here } } 

Eğer örneğine tüm seçeneklerinizi uygulamak istiyorsanız, Strüktür kırıcı olmadan Object.assign kullanabilirsiniz:

ikincisi Object.assign ve strüktür kullanır Genel soru, bir nesne başlatıcısı yerine varolan bir nesnede özellik oluşturmayı sağlayan bir yıkıcı atama formu olup olmadığıdır. – Pointy

+1

Her neyse, her zaman Object.assign (bu, seçenekler) vardır; ' – Pointy

+1

Aynı sözdizimini kurucular dışında da uygulayabileceğinizi belirtmek gerekir. Verilen iki nesne vardır: '' o = {a: 1, b: 2}, p = {}; '. '' Daha az karmaşık bir yapıya dönüştürmek '' bir kekin barışıdır: '({b: p.b} = o);' Nesne {b: 2} 'yi' p' için verir. – ftor

cevap

6

Bunu yapmanın birden çok yolu vardır. İlki sadece ve assigns the properties of options to properties on this kurucuların kullanır:

class Foo { 
    constructor(options) { 
    ({one: this.one, two: this.two} = options); 
    // Do something else with the other options here 
    } 
} 

ekstra parantez ihtiyaç vardır, aksi JS motoru değişmezi bir nesne ya da bir blok deyimi için { ... } sanabilir.

class Foo { 
    constructor(options) { 
    Object.assign(this, options); 
    } 
} 
+0

Teşekkürler @nils! Tam olarak aradığım şey bu. İlk çözüm en özlü ve biraz daha gelişmiş bir yıkım kullanıyor ya da kodun okunması/çalıştırılması hakkında çoktan biliyorsunuz ya da çabucak öğreniyorsunuz. 2. en belirgin ve en belirgin olanı ise 3. sırada belirttiğiniz kullanım durumu için harika. – Aaron