问题:
Javascript函数需要很少的参数才能使用:
function kick(person, reason, amount) {
// kick the *person* with the *amount*, based on the *reason*
}
由于存在no way to do function overloading in JS like how you do in Java,如果需要对其进行设计以方便将来进行改进(添加参数),则可以将其编写为:
/* Function Parameters pattern */
function kick() {
// kick the person as in *arguments[0]*, with the amount as in *arguments[1]*,
// based on the reason as in *arguments[2]*, with the strength as in *arguments[3]*
}
或者
/* Object Configuration Pattern */
function kick(config) {
// kick the person as in *config.person*, with the amount as in *config.amount*,
// based on the reason as in *config.reason*, with the strength as in *config.strength*
}
我确实知道对象配置模式允许augmentation for any default properties。
因此,问题是:
如果我不需要使用参数扩充任何属性,是否有任何重要理由使用任何一种建议的解决方案而不是另一种?
最佳答案
使用对象有一些优点:
1.代码更具可读性
考虑以下两个调用:
kick({user: u,
reason: "flood",
log: true,
rejoin: false,
timeout: 60000,
privmessage: true});
kick(u, "flood", true, false, 60000, true);
想象其他人正在阅读通话。什么是第一个
true
?还请注意,您自己在几个月后的位置将完全相同(不是记住,kick
的第四个参数与不知道它非常相似)。2.您可以使用隧道参数
使用对象方法,您可以向函数传递一组参数,该函数必须使用这些参数来调用另一个函数
function kickgroup(users, parms) {
for (var i=0; i<users.lenght; i++) {
var uparms = Object.create(parms);
uparms.user = users[i];
kick(uparms);
}
}
还要注意,在
arguments
情况下,您不需要使用arguments[x]
语法来惩罚自己。您只需要声明参数并在函数演化时添加它们即可:任何未传递的参数都将被设置为undefined
(如果需要,您仍然可以访问arguments.length
来区分调用方是否显式传递了函数undefined
)。关于Javascript:配置模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7466817/