我有一个函数,可以使用包含多个选项的可选对象调用,如果省略,每个选项都应回退到默认值。
我目前正在这样做:
function f(options){
var _options = options || {};
_options.propertyOne = options.propertyOne || 50;
_options.propertyTwo = options.propertyOne || 100;
_options.propertyThree = options.propertyThree || {};
_options.propertyThree.subPropOne = options.propertyThree.subPropOne || 150;
//etc...
}
var options = {
propertyOne: 20,
propertyThree: {
subPropOne: 100
}
}
f(options);
然而,随着选项数量的增加,代码看起来越来越混乱。还有一个潜在的问题是错误/零值被忽略(尽管所有属性当前都是数字且非零)。
有没有更有效、更简洁的方法来实现这一目标?我考虑过在我的函数中创建一个初始化为默认值的对象,然后递归地将参数中提供的任何选项复制给它,但我不确定这样做是否会引入我还没有想到的新问题。
编辑:
我将用来递归复制属性的函数:
function copyOptions(from, to){
for(var i in from){
if(typeof from[i] == "object"){
to[i] = copyOptions(from[i], to[i]);
}else if(typeof from[i] != "undefined"){
to[i] = from[i];
}
}
}