2010-04-29 67 views
2

是否可以根据传入的参数数量覆盖函数?例如:根据传递的参数覆盖Javascript函数

function abc(name) { 
    document.write ('My name is' + name); 
} 

function abc(name,friend) { 
    document.write ('My name is' + name + 'and my best friend\'s name is' + friend); 
} 

所以在HTML如果我只是叫ABC(乔治),将使用该函数的第一个版本,但如果我叫ABC(乔治,约翰),它会使用第二个版本。

可能还有其他的方法来完成我使用的例子,但我只是想知道这个概念在javascript中是否合理。

回答

10

JavaScript不支持函数重载。

但您可以:

if (typeof friend === "undefined") { 
    // do something 
} else { 
    // do something else 
} 
+0

这是在JavaScript实现方法重载的标准呢? – Pierreten 2010-04-29 15:23:05

+0

谢谢,我不知道这个词是什么东西(难怪我的谷歌搜索结果被吸引了!)。 – Choy 2010-04-29 15:27:24

+0

另外,我注意到您在示例中使用了严格的平等。如果我真的通过它,朋友是整数还是字符串,会有关系吗?所以abc(乔治,5)而不是abc(乔治,约翰)或abc(乔治,“5”)。 – Choy 2010-04-29 15:34:45

2

是的,的确,JavaScript的默认情况下做到这一点。如果你有一个功能:

function addInts(a, b, c) 
{ 
     if(c != undefined) 
     return a + b + c; 
     else 
     return a + b; 
} 

addInts(3, 4); 
addInts(3, 4, 5); 
0

不,原生Javascript不允许重载函数。

解决方法是只发送该参数。你会在最后一个参数中得到未定义的。

1

您可以将所需的参数,并通过其余的对象

abc(name); 
abc(name, {"friend": friend}); 
abc(name, {"friend": friend, "age": 21}); 

function abc(name, extra) { 
    if (!extra.friend) 
     alert("no mates"); 
    for (var key in extra) 
     ... 
} 
4

由于这是这里没有提到我以为我会扔了这一点,有作为。你也可以使用arguments对象,如果你的唯一目的是覆盖基于参数的数量(就像你在你的第一句话提到):

switch (arguments.length) { 
    case 0: 
     //Probably error 
     break; 
    case 1: 
     //Do something 
     break; 
    case 2: 
    default: //Fall through to handle case of more parameters 
     //Do something else 
     break; 
}