2015-03-14 16 views
10

Czy istnieje sposób na zachowanie nazwy zniszczonego argumentu funkcji? Np. Nazwa obiektu głównego?Parametr funkcji destrukcji ES6 - nazewnictwo obiektu głównego

W ES5, mogę to zrobić (za pomocą dziedziczenia jako metaforę, aby punkt):

// 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 
}; 

używam tego samego options obiekt posiadać wiele parametrów konfiguracyjnych. Niektóre parametry są używane przez klasę nadrzędną, a niektóre są używane przez podklasę.

Czy jest sposób na to w przypadku destrukturyzowanych argumentów funkcji w ES6?

// 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? 
}; 

Albo muszę wyodrębnić wszystkie opcje w setupChildClass6() tak, że mogą one być indywidualnie przeszedł do setupParentClass6()?

// ugh. 
var setupChildClass6b = ({minVal, maxVal, rows, columns}) => { 
    rangeSlider.setup(minVal, maxVal); 
    setupParentClass6({rows, columns}); 
}; 

Odpowiedz

7

Mam argumenty "opcje" w zbyt wielu miejscach sam. Wybrałbym 1 dodatkowy wiersz kodu. Nie zasługuje na ten przykład, ale jest dobrym rozwiązaniem, gdy ma destrukturyzację na większej liczbie linii.

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

Zgadzam się - to też wykorzystałem. Wszyscy nauczyliśmy się używać es6 znacznie lepiej w ciągu ostatnich kilku miesięcy! – jbx

3

Nie można używać destrukturyzacji i prostego nazwanego argumentu pozycyjnego dla tego samego parametru w tym samym czasie. Co można zrobić:

  1. Zastosowanie rozpad na setupParentClass6 funkcję, ale starego podejścia ES6 dla setupChildClass6 (myślę, że jest to najlepszy wybór, po prostu zrobić nazwa krótsza):

    var setupChildClass6 = (o) => { 
        rangeSlider.setup(o.minVal, o.maxVal); 
        setupParentClass6(o); 
    }; 
    
  2. używać starych arguments obiekt. Ale arguments może spowolnić funkcję (V8 szczególności), więc myślę, że jest to złe podejście:

    var setupChildClass6 = ({minVal, maxVal}) => { 
        rangeSlider.setup(minVal, maxVal); 
        setupParentClass6(arguments[0]); 
    }; 
    
  3. ES7 ma propozycję rest/spread properties (jeśli nie potrzebujesz minVal i maxVal w setupParentCalss6 funkcji):

    Niestety nie jest to ES6.

+0

Dzięki, super-pomocny. Właściwie nr 2 jest najbliższy intencji, a spowolnienie nie będzie miało znaczenia, biorąc pod uwagę sposób użycia tej funkcji. Na razie używam Babel, więc być może wkrótce uzyska on dostęp do obiektów. – jbx

+2

Użycie 'argumentów', jak pokazano w punkcie # 2, nie jest w rzeczywistości wolne. Ale uważam to za nieczytelne. – Bergi

+1

Właściwości reszt mogą nie rozwiązać twojego problemu, ponieważ pobierają one 'minVal' i' maxVal' z obiektów 'options'. Strzec się. – Bergi