2015-03-14 3 views
10

Есть ли способ сохранить имя аргумента разрушенной функции? I.e., имя корневого объекта?Параметр функции деструктуризации ES6 - Именование корневого объекта

В ES5, я мог бы сделать это (используя наследование в качестве метафоры, чтобы сделать точку):

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

Я использую один и тот же объект options провести несколько параметров конфигурации. Некоторые параметры используются родительским классом, а некоторые используются подклассом.

Есть ли способ сделать это с аргументами деструктивной функции в 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? 
}; 

Или мне нужно, чтобы извлечь все варианты в setupChildClass6(), так что они могут быть по отдельности прошли в setupParentClass6()?

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

ответ

7

У меня есть аргументы «опций» на слишком многих местах. Я бы выбрал одну дополнительную строку кода. Не достойный в этом примере, но хорошее решение, когда есть деструкция на большее количество строк.

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

Согласен - это то, что я использовал. Мы все научились использовать es6 намного лучше за последние несколько месяцев! – jbx

3

Вы не можете использовать деструктурирование и простой именованный позиционный аргумент для одного и того же параметра одновременно. Что вы можете сделать:

  1. Использование деструктурирующий для setupParentClass6 функции, но старый ES6 подход к setupChildClass6 (я думаю, что это лучший выбор, просто сделать имя короче):

    var setupChildClass6 = (o) => { 
        rangeSlider.setup(o.minVal, o.maxVal); 
        setupParentClass6(o); 
    }; 
    
  2. Использование старых arguments объект. Но arguments может замедлить функцию (V8 частности), так что я думаю, что это плохой подход:

    var setupChildClass6 = ({minVal, maxVal}) => { 
        rangeSlider.setup(minVal, maxVal); 
        setupParentClass6(arguments[0]); 
    }; 
    
  3. ES7 имеет предложение о rest/spread properties (если вам не нужно minVal и maxVal в setupParentCalss6 функции):

    К сожалению, это не ES6.

+0

Спасибо, очень полезно. На самом деле № 2 ближе всего к намерению, и замедление не будет актуальным, учитывая, как эта функция используется. На данный момент я использую Babel, поэтому, возможно, он скоро получит свойства отдыха на объектах. – jbx

+2

Использование аргументов, как показано в # 2, на самом деле не является медленным. Но я бы счел его нечитаемым. – Bergi

+1

Свойства останова могут не решить вашу проблему, так как из объектов 'options' они принимают' minVal' и 'maxVal'. Осторожно. – Bergi

Смежные вопросы