2016-06-30 12 views
7

Kann die Destrukturierungszuweisung in einem Konstruktor der JavaScript-Klasse verwendet werden, um die Instanzvariablen so zuzuordnen, wie Sie es mit normalen Variablen tun können?Ist es möglich, in einem JavaScript-Konstruktor Instanz-/Membervariablen zu destrukturieren?

Das folgende Beispiel funktioniert:

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

Aber ich kann nicht so etwas wie die folgenden an die Arbeit:

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

Ich denke, die mehr allgemeine Frage ist, ob es ein Destrukturierungszuweisungsformular gibt, das das Erstellen von Eigenschaften für ein vorhandenes Objekt anstelle eines Objektinitialisierers vorsieht. – Pointy

+1

Anyway gibt es immer 'Object.assign (this, options);' – Pointy

+1

Es ist erwähnenswert, dass Sie die gleiche Syntax auch außerhalb von Konstruktoren anwenden können. Gegeben sind zwei Objekte: 'let o = {a: 1, b: 2}, p = {}; '. Dekonstruieren Sie 'o' zu einem weniger komplexen' p' ist ein Stück Kuchen: '({b: p.b} = o);' ergibt 'Objekt {b: 2}' für 'p'. – ftor

Antwort

6

Es gibt mehrere Möglichkeiten, dies zu tun. Die erste verwendet Destrukturierung nur und 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 
    } 
} 

Die zusätzlichen Klammern benötigt werden, da sonst der JS Motor könnte die { ... } für ein Objekt wörtlichen oder eine Blockanweisung verwechseln.

Die zweite verwendet Object.assign und Destrukturierung:

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

Wenn Sie alle Optionen auf die Instanz anwenden möchten, können Sie Object.assign ohne Destrukturierung verwenden:

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

Danke @nils! Genau das habe ich gesucht. Die erste Lösung ist die prägnanteste und verwendet eine etwas fortgeschrittenere Destrukturierung, die Sie entweder bereits kennen oder schnell herausfinden, wenn Sie den Code lesen/ausführen. Der zweite ist der klarste und offensichtlichste, während der dritte für den von Ihnen beschriebenen Anwendungsfall großartig ist. – Aaron