Klassischer (Nicht-js) Ansatz zur Überladung:
function myFunc(){
//code
}
function myFunc(overloaded){
//other code
}
In Javascript können nicht mehr als eine Funktion mit demselben Namen definiert werden. Als solche zeigen sich solche Dinge:
function myFunc(options){
if(options["overloaded"]){
//code
}
}
Gibt es eine bessere Problemumgehung für das Überladen von Funktionen in Javascript als das Übergeben eines Objekts mit den darin enthaltenen Überladungen?
Das Übergeben von Überladungen kann schnell dazu führen, dass eine Funktion zu ausführlich wird, da für jede mögliche Überladung eine bedingte Anweisung erforderlich wäre. Die Verwendung von Funktionen zum Erreichen des //code
Inneren dieser bedingten Anweisungen kann zu schwierigen Situationen mit Gültigkeitsbereichen führen.
javascript
Travis J.
quelle
quelle
Antworten:
Das Überladen von Argumenten in Javascript hat mehrere Aspekte:
Variable Argumente - Sie können verschiedene Sätze von Argumenten (sowohl in Typ als auch in Menge) übergeben, und die Funktion verhält sich so, dass sie mit den an sie übergebenen Argumenten übereinstimmt.
Standardargumente - Sie können einen Standardwert für ein Argument definieren, wenn es nicht übergeben wird.
Benannte Argumente - Die Reihenfolge der Argumente spielt keine Rolle mehr und Sie benennen nur, welche Argumente Sie an die Funktion übergeben möchten.
Unten finden Sie einen Abschnitt zu jeder dieser Kategorien der Argumentbehandlung.
Variable Argumente
Da in Javascript keine Typprüfung für Argumente oder die erforderliche Anzahl von Argumenten vorhanden ist, können Sie nur eine Implementierung verwenden
myFunc()
, die sich an die an sie übergebenen Argumente anpassen kann, indem Sie den Typ, das Vorhandensein oder die Anzahl der Argumente überprüfen.jQuery macht das die ganze Zeit. Sie können einige der Argumente optional machen oder in Ihrer Funktion verzweigen, je nachdem, welche Argumente an sie übergeben werden.
Bei der Implementierung dieser Arten von Überlastungen stehen Ihnen verschiedene Techniken zur Verfügung:
undefined
.arguments.length
.arguments
Pseudo-Array verwenden, um auf ein bestimmtes Argument mit zuzugreifenarguments[i]
.Hier sind einige Beispiele:
Schauen wir uns die
obj.data()
Methode von jQuery an . Es werden vier verschiedene Nutzungsformen unterstützt:Jeder löst ein anderes Verhalten aus und würde ohne diese dynamische Form der Überladung vier separate Funktionen erfordern.
So kann man zwischen all diesen Optionen auf Englisch unterscheiden und sie dann alle im Code kombinieren:
Wenn das erste übergebene Argument
.data()
eine Zeichenfolge ist und das zweite Argumentundefined
, muss der Aufrufer dieses Formular verwenden.Wenn das zweite Argument nicht undefiniert ist, legen Sie den Wert eines bestimmten Schlüssels fest.
Wenn keine Argumente übergeben werden, geben Sie alle Schlüssel / Werte in einem zurückgegebenen Objekt zurück.
Wenn der Typ des ersten Arguments ein einfaches Objekt ist, legen Sie alle Schlüssel / Werte von diesem Objekt fest.
So können Sie all diese Elemente in einem Satz Javascript-Logik kombinieren:
Der Schlüssel zu dieser Technik besteht darin, sicherzustellen, dass alle Arten von Argumenten, die Sie akzeptieren möchten, eindeutig identifizierbar sind und es keine Verwirrung darüber gibt, welche Form der Anrufer verwendet. Dies erfordert im Allgemeinen die richtige Reihenfolge der Argumente und die Sicherstellung, dass Typ und Position der Argumente so eindeutig sind, dass Sie immer erkennen können, welches Formular verwendet wird.
Wenn Sie beispielsweise eine Funktion haben, die drei Zeichenfolgenargumente akzeptiert:
Sie können das dritte Argument leicht optional machen und diese Bedingung leicht erkennen, aber Sie können nicht nur das zweite Argument optional machen, da Sie nicht sagen können, welches dieser Argumente der Anrufer übergeben soll, da es keine Möglichkeit gibt, festzustellen, ob das zweite Argument vorliegt Das Argument soll das zweite Argument sein, oder das zweite Argument wurde weggelassen. Was also an der Stelle des zweiten Arguments steht, ist tatsächlich das dritte Argument:
Da alle drei Argumente vom gleichen Typ sind, können Sie den Unterschied zwischen verschiedenen Argumenten nicht erkennen, sodass Sie nicht wissen, was der Aufrufer beabsichtigt hat. Bei diesem Aufrufstil kann nur das dritte Argument optional sein. Wenn Sie das zweite Argument weglassen möchten, muss es stattdessen als
null
(oder ein anderer erkennbarer Wert) übergeben werden, und Ihr Code erkennt Folgendes:Hier ist ein jQuery-Beispiel für optionale Argumente. Beide Argumente sind optional und nehmen Standardwerte an, wenn sie nicht übergeben werden:
Hier ist ein jQuery-Beispiel, bei dem das Argument fehlen kann oder einer von drei verschiedenen Typen, wodurch Sie vier verschiedene Überladungen erhalten:
Benannte Argumente
In anderen Sprachen (wie Python) können benannte Argumente übergeben werden, um nur einige Argumente zu übergeben und die Argumente unabhängig von der Reihenfolge zu machen, in der sie übergeben werden. Javascript unterstützt die Funktion benannter Argumente nicht direkt. Ein Entwurfsmuster, das üblicherweise an seiner Stelle verwendet wird, besteht darin, eine Karte mit Eigenschaften / Werten zu übergeben. Dies kann durch Übergeben eines Objekts mit Eigenschaften und Werten erfolgen. In ES6 und höher können Sie tatsächlich ein Map-Objekt selbst übergeben.
Hier ist ein einfaches ES5-Beispiel:
jQuery's
$.ajax()
akzeptiert eine Verwendungsform, bei der Sie nur einen einzelnen Parameter übergeben, bei dem es sich um ein reguläres Javascript-Objekt mit Eigenschaften und Werten handelt. Welche Eigenschaften Sie übergeben, bestimmt, welche Argumente / Optionen an den Ajax-Aufruf übergeben werden. Einige können erforderlich sein, viele sind optional. Da es sich um Eigenschaften eines Objekts handelt, gibt es keine bestimmte Reihenfolge. Tatsächlich gibt es mehr als 30 verschiedene Eigenschaften, die an dieses Objekt übergeben werden können. Es ist nur eine (die URL) erforderlich.Hier ist ein Beispiel:
Innerhalb der
$.ajax()
Implementierung kann es dann einfach abfragen, welche Eigenschaften an das eingehende Objekt übergeben wurden, und diese als benannte Argumente verwenden. Dies kann entweder mitfor (prop in obj)
oder durch Abrufen aller Eigenschaften in einem Array mitObject.keys(obj)
und anschließendes Iterieren dieses Arrays erfolgen.Diese Technik wird in Javascript sehr häufig verwendet, wenn eine große Anzahl von Argumenten vorhanden ist und / oder viele Argumente optional sind. Hinweis: Dies stellt eine Belastung für die Implementierungsfunktion dar, um sicherzustellen, dass ein minimal gültiger Satz von Argumenten vorhanden ist, und um dem Aufrufer ein Debug-Feedback zu geben, was fehlt, wenn nicht genügend Argumente übergeben werden (wahrscheinlich durch Auslösen einer Ausnahme mit einer hilfreichen Fehlermeldung). .
In einer ES6-Umgebung ist es möglich, mithilfe der Destrukturierung Standardeigenschaften / -werte für das oben übergebene Objekt zu erstellen. Dies wird in diesem Referenzartikel ausführlicher erläutert .
Hier ist ein Beispiel aus diesem Artikel:
Dies schafft Standardeigenschaften und Werte für die
start
,end
undstep
Eigenschaften auf ein Objekt auf den übergebenenselectEntries()
Funktion.Standardwerte für Funktionsargumente
In ES6 fügt Javascript eine integrierte Sprachunterstützung für Standardwerte für Argumente hinzu.
Beispielsweise:
Weitere Beschreibung der Möglichkeiten, wie dies hier auf MDN verwendet werden kann .
quelle
resetProgressBar: function(display_errors, lockout = false)
.Das Überladen einer Funktion in JavaScript kann auf viele Arten erfolgen. Alle von ihnen beinhalten eine einzelne Master-Funktion, die entweder alle Prozesse ausführt oder an Unterfunktionen / Prozesse delegiert.
Eine der häufigsten einfachen Techniken beinhaltet einen einfachen Wechsel:
Eine elegantere Technik wäre die Verwendung eines Arrays (oder Objekts, wenn Sie nicht bei jeder Argumentanzahl Überladungen vornehmen ):
Das vorherige Beispiel ist nicht sehr elegant, jeder kann es ändern
fooArr
, und es würde fehlschlagen, wenn jemand mehr als zwei Argumente an übergibt.foo
Eine bessere Form wäre daher, ein Modulmuster und einige Überprüfungen zu verwenden:Natürlich möchten Ihre Überladungen möglicherweise eine dynamische Anzahl von Parametern verwenden, sodass Sie ein Objekt für die
fns
Sammlung verwenden können.Meine persönliche Präferenz ist in der Regel die
switch
, obwohl sie die Master-Funktion erweitert. Ein häufiges Beispiel dafür, wo ich diese Technik verwenden würde, wäre eine Accessor / Mutator-Methode:quelle
Sie können keine Methodenüberladung im engeren Sinne durchführen. Nicht so, wie es in
java
oder unterstützt wirdc#
.Das Problem ist, dass JavaScript das Überladen von Methoden NICHT nativ unterstützt. Wenn also zwei oder mehr Funktionen mit demselben Namen angezeigt / analysiert werden, wird nur die zuletzt definierte Funktion berücksichtigt und die vorherigen überschrieben.
Eine der Möglichkeiten, die meiner Meinung nach für den größten Teil des Falls geeignet sind, ist folgende:
Nehmen wir an, Sie haben eine Methode
Anstatt eine Methode zu überladen, die in Javascript nicht möglich ist, können Sie eine neue Methode definieren
und ändern Sie dann die 1. Funktion wie folgt -
Wenn Sie viele solcher überladenen Methoden haben, sollten Sie
switch
nicht nurif-else
Anweisungen verwenden.( weitere Details ) PS: Der obige Link führt zu meinem persönlichen Blog, der zusätzliche Details dazu enthält.
quelle
Ich verwende einen etwas anderen Überladungsansatz basierend auf der Argumentnummer. Ich glaube jedoch, dass John Fawcetts Ansatz auch gut ist. Hier das Beispiel, Code basierend auf den Erklärungen von John Resig (jQuery's Author).
Benutzerfreundlichkeit:
quelle
In Javascript können Sie die Funktion nur einmal implementieren und die Funktion ohne die Parameter aufrufen.
myFunc()
Anschließend prüfen Sie, ob die Optionen "undefiniert" sind.quelle
Ich habe versucht, eine elegante Lösung für dieses hier beschriebene Problem zu entwickeln . Und die Demo finden Sie hier . Die Verwendung sieht folgendermaßen aus:
Die Methoden, um dies zu erreichen:
quelle
https://github.com/jrf0110/leFunc
quelle
Kein Problem mit Überladung in JS. Wie kann man beim Überladen einen sauberen Code pflegen?
Sie können eine Weiterleitung verwenden , um sauberen Code zu erhalten, basierend auf zwei Dingen:
Art der Argumente (beim Aufruf der Funktion)
quelle
Überprüfen Sie dies heraus:
http://www.codeproject.com/Articles/688869/Overloading-JavaScript-Functions
Grundsätzlich nummerieren Sie in Ihrer Klasse Ihre Funktionen, die überladen werden sollen, und fügen dann mit einem Funktionsaufruf schnell und einfach eine Funktionsüberladung hinzu.
quelle
Da JavaScript keine Funktionsüberladungsoptionen hat , kann stattdessen ein Objekt verwendet werden. Wenn ein oder zwei Argumente erforderlich sind, ist es besser, sie vom Optionsobjekt zu trennen. Hier ist ein Beispiel für die Verwendung des Optionsobjekts und der aufgefüllten Werte als Standardwert, falls im Optionsobjekt kein Wert übergeben wurde.
}}
Hier ist ein Beispiel für die Verwendung des Optionsobjekts
quelle
Dazu müssen Sie eine Funktion erstellen, die die Funktion einem Objekt hinzufügt. Diese wird dann abhängig von der Anzahl der Argumente ausgeführt, die Sie an die Funktion senden:
quelle
Ich möchte Unterfunktionen innerhalb einer übergeordneten Funktion hinzufügen, um die Fähigkeit zu erreichen, zwischen Argumentgruppen für dieselbe Funktionalität zu unterscheiden.
quelle
Was Sie erreichen möchten, tun Sie am besten mit der lokalen Argumentvariablen der Funktion .
Eine bessere Erklärung, wie dies funktioniert, finden Sie hier .
quelle