Ich mache das oft:
C#:
public string CatStrings(string p1) {return p1;}
public string CatStrings(string p1, int p2) {return p1+p2.ToString();}
public string CatStrings(string p1, int p2, bool p3) {return p1+p2.ToString()+p3.ToString();}
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
JavaScript-Äquivalent:
function CatStrings(p1, p2, p3)
{
var s = p1;
if(typeof p2 !== "undefined") {s += p2;}
if(typeof p3 !== "undefined") {s += p3;}
return s;
};
CatStrings("one"); // result = one
CatStrings("one",2); // result = one2
CatStrings("one",2,true); // result = one2true
Dieses besondere Beispiel ist eigentlich eleganter in Javascript als C#. Parameter, die nicht angegeben werden, sind in Javascript "undefiniert", was in einer if-Anweisung zu false ausgewertet wird. Allerdings ist die Funktion Definition nicht vermitteln die Informationen, dass p2 und p3 sind optional. Wenn Sie viele Überladungen benötigen, hat jQuery beschlossen, ein Objekt als Parameter zu verwenden, zum Beispiel jQuery.ajax(options). Ich stimme ihnen zu, dass dies der leistungsfähigste und am besten dokumentierbare Ansatz für Überladung ist, aber ich brauche selten mehr als ein oder zwei schnelle optionale Parameter.
EDIT: IF-Test auf Vorschlag von Ian geändert
22 Stimmen
Vielleicht wäre es sinnvoll zu fragen, warum Sie glauben, dass Sie die Überladung von Funktionen überhaupt brauchen. Ich denke, das wird uns einer echten Lösung näher bringen.
1 Stimmen
Dies ist geschlossen, aber ich tue das folgende: this.selectBy = { instance: selectByInstance, // Function text: selectByText, // Function value: selectByValue // Function };
0 Stimmen
Meine Antwort zeigt, wie man Laufzeit Funktion Überladen zu tun, hat es eine Geschwindigkeit Strafe und ich würde nicht raten, es zu tun, um Javascript-Spezifikation zu umgehen. Das Überladen von Funktionen ist eigentlich eine Aufgabe der Kompilierzeit. Ich stelle die Antwort nur für akademische Zwecke zur Verfügung und überlasse es Ihrem eigenen Ermessen, ob Sie sie im Code verwenden wollen oder nicht.
2 Stimmen
Nur für den Fall, dass es nützlich ist, habe ich ein leichtgewichtiges js-Framework gebaut, das eine typbasierte Methodenüberladung ermöglicht. Natürlich gelten die gleichen Vorbehalte in Bezug auf die Leistung, aber es hat gut funktioniert für meine Bedürfnisse so weit und hat noch eine ganze Menge Raum für Verbesserungen: blog.pebbl.co.uk/2013/01/describejs.html#methodoverloading
3 Stimmen
Geschlossen, weil er auf Meinungen basiert, und trotzdem hat er 871 positive Bewertungen. Das bedeutet etwas