2015-03-14 10 views
10

Gibt es eine Möglichkeit, den Namen eines destrukturierten Funktionsarguments beizubehalten? Das heißt, der Name des Root-Objekts?ES6-Destrukturierungsfunktionsparameter - Benennung des Wurzelobjekts

In ES5, ich könnte diese (mit Vererbung als Metapher auf den Punkt zu machen) zu tun:

// ES5: 
var setupParentClass5 = function(options) { 
    textEditor.setup(options.rows, options.columns); 
}; 

var setupChildClass5 = function(options) { 
    rangeSlider.setup(options.minVal, options.maxVal); 
    setupParentClass5(options); // <= we pass the options object UP 
}; 

ich das gleiche options Objekt mit Hilfe von Parametern mehrere Konfiguration zu halten. Einige Parameter werden von der übergeordneten Klasse verwendet und einige von der Unterklasse.

Gibt es eine Möglichkeit, dies mit destrukturierten Funktionsargumenten in ES6 zu tun?

// ES6: 
var setupParentClass6 = ({rows, columns}) => { 
    textEditor.setup(rows, columns); 
}; 

var setupChildClass6 = ({minVal, maxVal}) => { 
    rangeSlider.setup(minVal, maxVal); 
    setupParentClass6(/* ??? */); // how to pass the root options object? 
}; 

Oder muss ich alle Optionen in setupChildClass6() extrahieren, so dass sie einzeln in setupParentClass6() weitergegeben werden?

Antwort

7

Ich habe die 'Optionen' Argumente an zu vielen Stellen selbst. Ich würde mich für eine zusätzliche Codezeile entscheiden. In diesem Beispiel nicht angemessen, aber eine gute Lösung, wenn Sie mehr Linien destrukturieren.

const setupChildClass6 = options => { 
    const {minVal, maxVal} = options; 
    rangeSlider.setup(minVal, maxVal); 
    setupParentClass6(options); 
}; 
+0

Einverstanden - das habe ich auch benutzt. Wir alle haben gelernt, ES6 in den letzten Monaten viel besser zu nutzen! – jbx

3

Sie können das Destrukturieren und das einfache benannte Positionsargument für denselben Parameter nicht gleichzeitig verwenden. Was Sie tun können:

  1. Verwenden Destrukturierung für setupParentClass6 Funktion, aber alt ES6 Ansatz für setupChildClass6 (Ich denke, das ist die beste Wahl, nur Name kürzer machen):

    var setupChildClass6 = (o) => { 
        rangeSlider.setup(o.minVal, o.maxVal); 
        setupParentClass6(o); 
    }; 
    
  2. Verwenden Sie die alte arguments Objekt. Aber arguments kann eine Funktion verlangsamen (V8), insbesondere so dass ich denke, es ist ein schlechter Ansatz:

    var setupChildClass6 = ({minVal, maxVal}) => { 
        rangeSlider.setup(minVal, maxVal); 
        setupParentClass6(arguments[0]); 
    }; 
    
  3. ES7 hat Vorschlag für rest/spread properties (wenn Sie nicht brauchen minVal und maxVal in setupParentCalss6-Funktion):

    Leider ist es nicht ES6.

+0

Danke, super-hilfreich. Tatsächlich ist Nr. 2 der Absicht am nächsten, und die Verlangsamung wird nicht relevant sein, wenn man bedenkt, wie die Funktion verwendet wird. Für den Moment verwende ich Babel, also wird es vielleicht bald Ruheeigenschaften auf Objekten bekommen. – jbx

+2

Die Verwendung von "Argumente" wie in # 2 gezeigt ist eigentlich nicht langsam. Aber ich würde es für unlesbar halten. – Bergi

+1

Resteigenschaften können Ihr Problem möglicherweise nicht lösen, da es 'minVal' und' maxVal' aus den 'options' -Objekten nimmt. In acht nehmen. – Bergi