2016-06-30 31 views
7

Czy możliwe jest użycie destructuring assignment w konstruktorze klasy JavaScript, aby przypisać zmienne instancji podobne do tego, jak można to zrobić do normalnych zmiennych?Czy możliwe jest zniszczenie zmiennych instancji/elementów w konstruktorze JavaScript?

Poniższy przykład działa:

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

Ale nie mogę dostać coś podobnego do następujących prac:

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

myślę, że więcej ogólne pytanie brzmi, czy istnieje formularz przypisywania destrukturyzacji, który zapewnia tworzenie właściwości na istniejącym obiekcie zamiast inicjatora obiektu. – Pointy

+1

W każdym razie zawsze jest 'Object.assign (this, options);' – Pointy

+1

Warto wspomnieć, że można zastosować tę samą składnię poza konstruktorami. Podano dwa obiekty: 'let o = {a: 1, b: 2}, p = {};'. Dekonstruuj "o" mniej skomplikowanemu "p" jest spokojem ciasta: '({b: p.b} = o);' daje 'Object {b: 2}' dla 'p'. – ftor

Odpowiedz

6

Istnieje wiele sposobów, aby to zrobić. Pierwszy z nich wykorzystuje tylko demontażu struktury i 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 
    } 
} 

potrzebne są dodatkowe nawiasy, inaczej silnik JS może pomylić { ... } dla obiektu dosłownym lub oświadczenie bloku.

Drugi wykorzystuje Object.assign i rozpad:

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

Jeśli chcesz zastosować wszystkie opcje na przykład, można użyć Object.assign bez destructuring:

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

Dzięki @nils! Właśnie tego szukałem. Pierwsze rozwiązanie jest najbardziej zwięzłe i wykorzystuje nieco bardziej zaawansowaną metodę destrukturyzacji, o której już wiesz albo szybko zorientujesz się, kiedy czytasz/uruchamiasz kod. Drugi jest najbardziej oczywistym i najbardziej oczywistym, podczas gdy trzeci jest świetny do opisanego przypadku użycia. – Aaron