2016-06-30 36 views
7

È possibile utilizzare l'assegnazione di destrutturazione in un costruttore di classi JavaScript per assegnare le variabili di istanza in modo simile a come è possibile farlo con le variabili normali?È possibile destrutturare le variabili di istanza/membro in un costruttore JavaScript?

Il seguente esempio funziona:

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

Ma non può ottenere qualcosa di simile al seguente al lavoro:

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

Penso che più la domanda generale è se esiste un modulo di assegnazione destrutturante che prevede la creazione di proprietà su un oggetto esistente anziché un inizializzatore dell'oggetto. – Pointy

+1

In ogni caso c'è sempre 'Object.assign (this, options);' – Pointy

+1

Vale la pena ricordare che è possibile applicare la stessa sintassi anche all'esterno dei costruttori. Sono dati due oggetti: 'let o = {a: 1, b: 2}, p = {};'. Decostruire 'o' in un' p' meno complesso è una pace di torta: '({b: p.b} = o);' produce 'Object {b: 2}' per 'p'. – ftor

risposta

6

Ci sono diversi modi di fare questo. Il primo usa la destrutturazione solo ed assigns the properties of options to properties on this:

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

sono necessari Le parentesi in più, altrimenti il ​​motore JS potrebbe confondere il { ... } per un oggetto letterale o una dichiarazione di blocco.

La seconda utilizza Object.assign e destrutturazione:

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

Se si desidera applicare tutte le opzioni per l'istanza, è possibile utilizzare Object.assign senza destrutturazione:

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

Grazie a @nils! Questo e 'esattamente quello che stavo cercando. La prima soluzione è la più concisa e utilizza una destrutturazione leggermente più avanzata di cui si conoscono già o che si capisce rapidamente durante la lettura/esecuzione del codice. Il secondo è il più chiaro e più ovvio mentre il terzo è ottimo per il caso d'uso che hai delineato. – Aaron