Параметр функции деструктуризации ES6 - именование корневого объекта
Есть ли способ сохранить имя аргумента деструктивной функции? I.e., имя корневого объекта?
В 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
для хранения нескольких параметров конфигурации. Некоторые параметры используются родительским классом, а некоторые используются подклассом.
Есть ли способ сделать это с помощью аргументов destructured function в 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});
};
Ответы
Ответ 1
У меня есть аргументы "опций" на слишком многих местах. Я бы выбрал одну дополнительную строку кода. Не достойный в этом примере, но хорошее решение, когда деструктурирование на большее количество строк.
const setupChildClass6 = options => {
const {minVal, maxVal} = options;
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
};
Ответ 2
Вы не можете сделать это непосредственно в аргументах, но вы можете извлечь значения позже:
function myFun(allVals) {
const { val1, val2, val3 } = allVals;
console.log("easy access to individual entries:", val2);
console.log("easy access to all entries:", allVals);
}
Ответ 3
Вы не можете одновременно использовать деструктурирование и простой именованный позиционный аргумент для одного и того же параметра. Что ты можешь сделать:
-
Используйте деструктуризацию для функции setupParentClass6
, но старый подход ES6 для setupChildClass6
(я думаю, что это лучший выбор, просто сделайте имя короче):
var setupChildClass6 = (o) => {
rangeSlider.setup(o.minVal, o.maxVal);
setupParentClass6(o);
};
-
Используйте старые arguments
объекта. Но arguments
могут замедлить функцию (в частности, V8), поэтому я считаю, что это плохой подход:
var setupChildClass6 = ({minVal, maxVal}) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(arguments[0]);
};
-
В ES7 есть предложение по свойствам отдыха/распространения (если вам не нужны minVal
и maxVal
в функции setupParentCalss6
):
var setupChildClass6b = ({minVal, maxVal, ...rest}) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(rest);
};
К сожалению это не ES6.