ES6解构函数参数 - 命名根对象

jbx*_*jbx 21 javascript arguments function destructuring ecmascript-6

有没有办法保留析构函数参数的名称?即,根对象的名称?

在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
};
Run Code Online (Sandbox Code Playgroud)

我使用相同的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?
};
Run Code Online (Sandbox Code Playgroud)

或者我是否需要提取所有选项setupChildClass6()以便可以单独传递setupParentClass6()

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

Nie*_*eek 11

我自己在很多地方都有'选项'论点.我会选择额外的一行代码.在这个例子中不值得,但在更多线路上进行解构时是一个很好的解决方案.

const setupChildClass6 = options => {
    const {minVal, maxVal} = options;
    rangeSlider.setup(minVal, maxVal);
    setupParentClass6(options); 
};
Run Code Online (Sandbox Code Playgroud)


Que*_*Roy 8

您不能直接在参数中执行此操作,但您可以在以后提取值:

function myFun(allVals) {
    const { val1, val2, val3 } = allVals;
    console.log("easy access to individual entries:", val2);
    console.log("easy access to all entries:", allVals);
}
Run Code Online (Sandbox Code Playgroud)

  • TL;可怜的智能感知博士。这种方法的问题是,使用 myFun 时不会有任何 allVals 结构的指示 (2认同)

ale*_*ods 6

您不能同时对同一参数使用解构和简单命名位置参数.你可以做什么:

  1. 使用解构setupParentClass6功能,但旧的ES6方法setupChildClass6(我认为这是最好的选择,只是缩短名称):

    var setupChildClass6 = (o) => {
      rangeSlider.setup(o.minVal, o.maxVal);
      setupParentClass6(o); 
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用旧arguments对象.但是arguments可以减慢功能(特别是V8),所以我认为这是一个糟糕的方法:

    var setupChildClass6 = ({minVal, maxVal}) => {
      rangeSlider.setup(minVal, maxVal);
      setupParentClass6(arguments[0]); 
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. ES7提出了休息/传播属性的建议(如果你不需要minValmaxValsetupParentCalss6功能上):

    var setupChildClass6b = ({minVal, maxVal, ...rest}) => {
      rangeSlider.setup(minVal, maxVal);
      setupParentClass6(rest);
    };
    
    Run Code Online (Sandbox Code Playgroud)

    不幸的是,它不是ES6.

  • #2中显示的`arguments`的用法实际上并不慢.但我认为这是不可读的. (2认同)
  • 其余属性可能无法解决您的问题,因为它确实从“options”对象中取出“minVal”和“maxVal”。谨防。 (2认同)