2010-04-29 8 views
2

Est-il possible de remplacer une fonction en fonction du nombre de paramètres que vous y passez? Par exemple:Surcharger la fonction Javascript en fonction des paramètres passés

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); 
} 

donc dans le code HTML si je viens d'appeler abc (george), il utiliserait la première version de la fonction, mais si j'ai appelé abc (george, john), il utiliserait la deuxième version.

Il peut y avoir d'autres façons d'accomplir l'exemple que j'ai utilisé, mais je me demande simplement si le concept est sain en javascript.

Répondre

10

JavaScript ne supporte pas la surcharge de fonctions.

Vous pouvez cependant:

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

Est-ce un moyen standard de mise en œuvre de la surcharge de méthode en JavaScript? – Pierreten

+0

Merci, je ne savais pas ce que le terme était pour ce genre de chose (pas étonnant que mes résultats de recherche Google aspiré!). – Choy

+0

En outre, je remarque que vous utilisez une stricte égalité dans votre exemple. Est-ce que cela importait que l'ami soit un entier ou une chaîne de caractères quand je le passe? Donc abc (george, 5) au lieu de abc (george, john) ou abc (george, "5"). – Choy

2

Eh oui, en effet, JavaScript font par défaut. Si vous avez une fonction:

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

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

Non, natif Javascript ne permet pas de surcharger les fonctions.

Une solution de contournement est juste n'envoyez pas ce paramètre. Vous obtiendrez indéfini dans le dernier paramètre.

1

Vous pouvez laisser l'argument requis et passer le reste dans un objet

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

Comme il n'a pas été mentionné ici, je pensais que je jetterais ce là-bas aussi. Vous pouvez également utiliser l'objet arguments si votre seule intention est de passer outre en fonction du nombre d'arguments (comme vous mentionnez dans votre première phrase):

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; 
} 
Questions connexes