问题: 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。
所以,问题是: 如果我不需要使用参数扩充任何属性,是否有任何重要原因使用任何一个建议的解决方案而不是另一个?
答案 0 :(得分:3)
使用对象有一些优点:
考虑以下两个电话:
kick({user: u,
reason: "flood",
log: true,
rejoin: false,
timeout: 60000,
privmessage: true});
kick(u, "flood", true, false, 60000, true);
并想象其他人在看电话。什么是第一个true
?另请注意,您自己在几个月内会处于相同的位置(不是记住 kick
的第四个参数是什么非常类似于不知道它。)
使用对象方法,您可以向函数传递一组参数,此函数必须使用这些参数来调用另一个函数
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
)。
答案 1 :(得分:2)
你不必严格遵守三者中的任何一个。如果你看看jQuery是如何做到的,它会检查参数的类型,数量和位置,以找出正在使用的函数的重载风格。
假设你有三种kick()
,一种是需要人,理由和数量的一种,一种只需要有理由和数量的人获取默认值,另一种是带有至少一个人的配置对象。你可以动态地看到你喜欢这三个选项中的哪一个:
function kick(person, reason, amount) {
if (person.person) {
// must be an object as the first parameter
// extract the function parameters from that object
amount = person.amount;
reason = person.reason;
}
amount = amount || 5; // apply default value if parameter wasn't passed
reason = reason || "dislike"; // apply default value if parameter wasn't passed
// now you have person, reason and amount and can do normal processing
// you could have other parameters too
// you just have to be to tell which parameter is which by type and position
// process the kick here using person, reason and amount
}
答案 2 :(得分:1)
JavaScript函数仅以其名称签名。
因此你可以这样做:
function kick(x, reason, amount) {
if(reason && amount) {
// do stuff with x as person, reason and amount
}
else if(x) {
// do stuff with x as config
}
else {
// do stuff with no parameters
}
}
另一种解决方案是使用arguments变量,该变量是一个数组,其中包含传递给javascript函数的所有参数
function kick() {
alert(arguments.length);
}