ES6解构函数参数——命名根对象
ES6 destructuring function parameter - naming root object
有没有办法保留解构函数参数的名称?即,根对象的名称?
在 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
对象来保存多个配置参数。一些参数被父class使用,一些被子class使用。
有没有办法在 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});
};
您不能同时对同一参数使用解构和简单命名位置参数。你可以做什么:
对setupParentClass6
函数使用解构,但对setupChildClass6
使用旧的ES6方法(我认为这是最好的选择,只是缩短名称):
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对rest/spread properties提出了建议(如果你不需要setupParentCalss6
函数中的minVal
和maxVal
):
var setupChildClass6b = ({minVal, maxVal, ...rest}) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(rest);
};
不幸的是它不是 ES6。
您不能直接在参数中执行此操作,但您可以在之后提取值:
function myFun(allVals) {
const { val1, val2, val3 } = allVals;
console.log("easy access to individual entries:", val2);
console.log("easy access to all entries:", allVals);
}
我自己在太多地方都有 'options' 论点。我会选择 1 行额外的代码。在这个例子中不值得,但在更多行上进行解构时是一个很好的解决方案。
const setupChildClass6 = options => {
const {minVal, maxVal} = options;
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
};
这是我能想到的最好的。不是很好,但比在另一条线上进行破坏要好得多(IMO)。它也以某种方式提醒您,您将首先提供 options
,并且您正在函数中解构它...
var setupParentClass6 = options => (({rows, columns}) => {
textEditor.setup(rows, columns);
})(options);
var setupChildClass6 = options => (({minVal, maxVal}) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
})(options);
就我个人而言,我宁愿在函数体内进行解构,但为了完整起见,我想表明在技术上可以通过参数访问“根”对象和解构的属性。
为此,我们利用参数可以访问其默认值中的前面参数这一事实。这允许您定义第二个参数来解构第一个参数:
var setupChildClass6 = (options, {minVal, maxVal}=options) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
};
所以这个函数有两个参数,并且默认使用第一个参数的第一个值作为第二个参数。
当然,您必须非常小心,以正确传达其目的。
有没有办法保留解构函数参数的名称?即,根对象的名称?
在 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
对象来保存多个配置参数。一些参数被父class使用,一些被子class使用。
有没有办法在 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});
};
您不能同时对同一参数使用解构和简单命名位置参数。你可以做什么:
对
setupParentClass6
函数使用解构,但对setupChildClass6
使用旧的ES6方法(我认为这是最好的选择,只是缩短名称):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对rest/spread properties提出了建议(如果你不需要
setupParentCalss6
函数中的minVal
和maxVal
):var setupChildClass6b = ({minVal, maxVal, ...rest}) => { rangeSlider.setup(minVal, maxVal); setupParentClass6(rest); };
不幸的是它不是 ES6。
您不能直接在参数中执行此操作,但您可以在之后提取值:
function myFun(allVals) {
const { val1, val2, val3 } = allVals;
console.log("easy access to individual entries:", val2);
console.log("easy access to all entries:", allVals);
}
我自己在太多地方都有 'options' 论点。我会选择 1 行额外的代码。在这个例子中不值得,但在更多行上进行解构时是一个很好的解决方案。
const setupChildClass6 = options => {
const {minVal, maxVal} = options;
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
};
这是我能想到的最好的。不是很好,但比在另一条线上进行破坏要好得多(IMO)。它也以某种方式提醒您,您将首先提供 options
,并且您正在函数中解构它...
var setupParentClass6 = options => (({rows, columns}) => {
textEditor.setup(rows, columns);
})(options);
var setupChildClass6 = options => (({minVal, maxVal}) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
})(options);
就我个人而言,我宁愿在函数体内进行解构,但为了完整起见,我想表明在技术上可以通过参数访问“根”对象和解构的属性。
为此,我们利用参数可以访问其默认值中的前面参数这一事实。这允许您定义第二个参数来解构第一个参数:
var setupChildClass6 = (options, {minVal, maxVal}=options) => {
rangeSlider.setup(minVal, maxVal);
setupParentClass6(options);
};
所以这个函数有两个参数,并且默认使用第一个参数的第一个值作为第二个参数。
当然,您必须非常小心,以正确传达其目的。