914 Stimmen

Funktionsüberladung in Javascript - Bewährte Praktiken

Was ist der beste Weg (s) zu fälschen Funktion Überladung in Javascript?

Ich weiß, dass es in Javascript nicht möglich ist, Funktionen wie in anderen Sprachen zu überladen. Wenn ich eine Funktion mit zwei Verwendungen bräuchte foo(x) y foo(x,y,z) welches der beste / bevorzugte Weg ist:

  1. Verwendung unterschiedlicher Namen in erster Linie
  2. Mit optionalen Argumenten wie y = y || 'default'
  3. Verwendung der Anzahl der Argumente
  4. Überprüfung der Argumenttypen
  5. Oder wie?

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.

720voto

epascarello Punkte 194350

Die beste Art und Weise, Funktionen mit Parametern zu überladen, ist, die Länge der Argumente oder die Typen nicht zu überprüfen; die Überprüfung der Typen macht Ihren Code nur langsam und Sie haben den Spaß an Arrays, Nullen, Objekten usw.

Die meisten Entwickler fügen ein Objekt als letztes Argument an ihre Methoden an. Dieses Objekt kann alles Mögliche enthalten.

function foo(a, b, opts) {
  // ...
  if (opts['test']) { } //if test param exists, do something.. 
}

foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});

Dann können Sie es in Ihrer Methode so handhaben, wie Sie wollen. (Schalter, if-else, etc.)

0 Stimmen

Irgendwelche Vorschläge zur Verwendung dieses Musters mit einem Rückruf? stackoverflow.com/questions/9831027/

45 Stimmen

Könnten Sie eine Beispielimplementierung von foo() zur Verfügung stellen, die veranschaulicht, wie diese "opts"-Parameter verwendet/referenziert werden?

24 Stimmen

Moe// Es könnte so sein; if(opts['test']) //if test param exists, do something.. if(opts['bar']) //if bar param exists, do something

196voto

rocketsarefast Punkte 3994

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

20 Stimmen

Parameter, die nicht angegeben werden, sind undefined in JS, nicht null . Als beste Praxis sollten Sie niemals etwas auf undefined also sollte es kein Problem sein, solange Sie Ihren Test auf p2 === undefined .

3 Stimmen

Wenn Sie bestehen false als letztes Argument, dann wird es nicht verkettet "false" bis zum Ende, denn die if(p3) verzweigt sich nicht.

1 Stimmen

Oder die populärere typeof p2 === "undefined"

120voto

Gumbo Punkte 617646

Es gibt keine wirkliche Funktionsüberladung in JavaScript, da es erlaubt, eine beliebige Anzahl von Parametern beliebigen Typs zu übergeben. Sie müssen innerhalb der Funktion prüfen, wie viele Argumente bestanden haben und welcher Art sie sind.

2 Stimmen

John Resig (von jQuery) hat dies einmal versucht, aber der Versuch war rein akademisch und hat keinen wirklichen Nutzen gebracht.

18 Stimmen

John Resigs Funktionsüberlastung hier ejohn.org/blog/javascript-method-overloading

0 Stimmen

@Terrance: Ich mag Resigs Methode auch. Sie funktioniert wie ein Zauber. Ich muss nur einen Weg finden, um einen Test für sie zu erstellen, um Anwendungsfälle zu validieren.

114voto

Marco Punkte 2522

Die richtige Antwort lautet: Es gibt kein Überladen in JAVASCRIPT.

Das Prüfen / Schalten innerhalb der Funktion ist nicht OVERLOADING.

Das Konzept der Überladung: In einigen Programmiersprachen ist das Überladen von Funktionen oder Methoden die Möglichkeit, mehrere Methoden desselben Namens mit unterschiedlichen Implementierungen zu erstellen. Beim Aufruf einer überladenen Funktion wird eine spezifische Implementierung dieser Funktion ausgeführt, die dem Kontext des Aufrufs entspricht, so dass ein Funktionsaufruf je nach Kontext unterschiedliche Aufgaben erfüllen kann.

Zum Beispiel sind doTask() und doTask(object O) überladene Methoden. Um die zweite Methode aufzurufen, muss ein Objekt als Parameter übergeben werden, während die erste Methode keinen Parameter benötigt und mit einem leeren Parameterfeld aufgerufen wird. Ein üblicher Fehler wäre es, dem Objekt in der zweiten Methode einen Standardwert zuzuweisen, was zu einem zweideutigen Aufruffehler führen würde, da der Compiler nicht wüsste, welche der beiden Methoden zu verwenden ist.

https://en.wikipedia.org/wiki/Function_overloading

Alle vorgeschlagenen Implementierungen sind großartig, aber um ehrlich zu sein, gibt es keine native Implementierung für JavaScript.

11 Stimmen

Endlich eine normale Antwort! ES GIBT KEINE ÜBERLADUNG IN JAVASCRIPT.

40 Stimmen

OP fragte nach einem Weg, um gefälscht Überlastung.

3 Stimmen

Wie ich bereits gesagt habe, sind wir hier, um die Menschen aufzuklären, wir geben ihnen nicht einfach Antworten, ohne zu überprüfen, ob das, was sie fragen, richtig ist.

27voto

t3rse Punkte 9900

Es gibt zwei Möglichkeiten, wie Sie dies besser angehen können:

  1. Übergeben Sie ein Wörterbuch (assoziatives Array), wenn Sie eine große Flexibilität wünschen

  2. Nehmen Sie ein Objekt als Argument und verwenden Sie prototypbasierte Vererbung, um die Flexibilität zu erhöhen.

1 Stimmen

Das war mein erster Gedanke, aber wenn die Funktion, die Sie erstellen, in einer Bibliothek oder von anderen verwendet werden soll, kann eine klare Aufzählung der Werte hilfreich sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X