2016-09-23 5 views
2

Ich habe diesen Code vor kurzem gesehen:Klasse Konstruktor/Funktion Syntax mit geschweiften Klammern um Parameterliste

class Foo { 
 
    constructor({ 
 
    a, 
 
    b, 
 
    c = [] 
 
    }) { 
 
    this.a = a; 
 
    this.b = b; 
 
    this.c = c; 
 
    console.log(this); 
 
    } 
 
} 
 
const foo = new Foo({ 
 
    a: 1, 
 
    b: 2 
 
});

Aber ich habe nie Parameter mit geschweiften Klammern Umwickeln der Parameternamen definiert gesehen . Mein Linter beschwert sich darüber, aber der Code funktioniert gut und so gehe ich davon aus, dass er gültig ist, da er ohne Fehler ausgeführt wird.

Ich habe die MDN-Dokumentation über, class, constructor und default arguments lesen. Allerdings sehe ich dieses Muster nirgendwo beschrieben (vielleicht habe ich es verpasst?).

Nach was ich suche, hat dieses Muster einen Namen, oder ist es irgendwo beschrieben?

+1

@Downvoter, in welcher Weise könnte diese Frage verbessert werden? – Bathsheba

+0

Ja, ich werde es verbessern, wenn ich weiß, was verbessert werden muss. – Xotic750

+1

Es ist "Parameter Destrukturierung". –

Antwort

3

Es parameter destructuring ist.

jedoch in diesem Fall können Sie einfach tun

class Foo { 
    constructor(opts) { 
    Object.assign(this, {c: []}, opts); 
    console.log(this); 
    } 
} 

const foo = new Foo({ 
    a: 1, 
    b: 2 
}); 

Sie sollten eine Art „es6“ Flagge finden für Ihre Linter es glücklich zu machen.

+0

Danke. Ich vermutete, dass es ähnlich war, wusste aber nicht, wie es hieß. Ich denke, dass ich meinen Linter aktualisieren muss, da ich bereits die Flagge gesetzt habe. – Xotic750

+1

'Object.assign' ist der Weg dorthin. Etwas kürzer, wenn Sie das "c" in ein Objekt im selben Aufruf "Objekt" setzen.assign (this, {c: []}, opts); ', allerdings wahrscheinlich auf Kosten einer zusätzlichen Zuweisung. –

+0

Ich frage mich, ob dies Auswirkungen auf Optimierungen hat. Einige Engines verfügen über Optimierungen, wenn sie alle Eigenschaften des Objekts statisch bestimmen können. Es ist möglich, dass sie versuchen könnten, es von der Anrufseite (n) herauszufinden. –

1

Aber ich habe noch nie Argumente wie diese zuvor gesehen.

Das ist Destrukturierung, nur auf die Argumente verwendet.

Ich konnte keine gute Referenz finden, aber ich glaube, das ist eine ES6-Funktion. Es zerlegt ein Objektargument in einzelne Variablen und weist den Variablen die Werte der Eigenschaften mit demselben Namen zu.

Es ist ähnlich wie zu tun:

class Foo { 
    constructor(obj) { 
    this.a = obj.a; 
    this.b = obj.b; 
    this.c = obj.c || []; 
    console.log(this); 
    } 
} 
+2

Eigentlich ist es eine ES6-Funktion. –

+2

Beschrieben hier denke ich: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Pulling_fields_from_objects_passed_as_function_parameter –

+0

Danke. Ich hatte Mühe, nach dem zu suchen, was ich sah. – Xotic750

Verwandte Themen