Подтвердить что ты не робот

Параметр функции деструктуризации 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});
};
4b9b3361

Ответ 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

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

  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 есть предложение по свойствам отдыха/распространения (если вам не нужны minVal и maxVal в функции setupParentCalss6):

    var setupChildClass6b = ({minVal, maxVal, ...rest}) => {
      rangeSlider.setup(minVal, maxVal);
      setupParentClass6(rest);
    };
    

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