Javascript überladen Punkt

8

Hallo, gibt es eine Möglichkeit, den '.' (Punkt) und [] Operator in Javascript zu überladen. Wenn ich also obj.Name oder obj ['Name'] sage, sollte es eine gemeinsame Methode in der obj-Klasse aufrufen, indem Name als Argument übergeben wird. Die ähnliche Funktionalität, die in Python mit der Property-Methode zur Verfügung steht. Aber hier möchte ich den ".Name" als Argument für die gemeinsame Methode übergeben.

gefällt das ..

%Vor%     
Adhi 31.12.2010, 09:35
quelle

4 Antworten

12

Antwort in 2010 : (siehe unten für ein Update 2013)

Nein, Sie können die Suche nach Eigenschaftsnamen nicht auf Ihre eigene Funktion umleiten.

Allerdings können Sie ab ECMAScript5 Eigenschaften mit "getters" und "setters" definieren. Dies ist ein neues Feature, das noch nicht allgemein unterstützt wird, aber wenn es so ist, wird es etwas vage ähnlich machen. Dies wird in einigen Teilen der Spezifikation behandelt. Wenn Sie also alle Ihre Eigenschaften auf diese Weise definiert und dann die eigentliche Anfrage an Ihre zentrale getValue -Funktion gesendet haben, würden Sie weitgehend das erreichen, was Sie wollten. Irgendwann mal. :-) Außer dass es getValue für eine Eigenschaft, die nicht existiert, nicht aufruft.

Antwort im Jahr 2013 :

Das wird sich bald ändern (und hat bereits für den aktuellen Firefox Benutzer): ECMAScript 6. Ausgabe wird Proxies haben. Sie sind in der Entwurfsspezifikation definiert und auch auf diese Seite (aber die Spezifikationen haben Vorrang).

Mit Proxys können Sie Objekte erstellen, die echte Proxies (Fassaden) für andere Objekte sind. Hier ist ein einfaches Beispiel, das alle Eigenschaftswerte, die Strings sind, beim Abrufen in Großbuchstaben umwandelt:

%Vor%

Live-Beispiel | Quelle

Operationen, die Sie nicht überschreiben, haben ihr Standardverhalten. Im obigen Fall überschreiben wir nur get , aber es gibt eine ganze Liste von Operationen, in die Sie sich einklinken können.

In der Liste der Argumente für die get -Handlerfunktion:

  • target ist das Objekt, das proxisiert wird ( original , in unserem Fall).
  • name ist (natürlich) der Name der Eigenschaft, die abgerufen wird.
  • receiver ist entweder der Proxy selbst oder etwas, das von ihm erbt. In unserem Fall ist receiver % === proxy , aber wenn proxy als Prototyp verwendet wurde, könnte receiver ein nachkommendes Objekt sein, also in der Funktionssignatur (aber am Ende, also Sie kann es einfach weglassen, wenn Sie es nicht wie in unserem obigen Beispiel verwenden).

Damit können Sie ein Objekt mit der gewünschten Fang-und-Setzer-Funktion erstellen:

%Vor%

Live-Beispiel | Quelle (Beachten Sie, dass ich receiver von den Funktionen entfernt habe, da wir sie nicht verwenden. receiver ist ein optionales viertes Argument für set .)

Die Ausgabe von oben ist:

%Vor%

Beachten Sie, wie wir die "nicht existierende" Nachricht erhalten, wenn wir versuchen, foo abzurufen, wenn sie noch nicht existiert, und noch einmal, wenn wir sie erstellen, aber nicht danach.

    
T.J. Crowder 31.12.2010 09:38
quelle
1

Nein, Sie können es nicht überladen oder in JavaScript ersetzen. Ich wünschte, ich hätte eine umfassendere / informativere Antwort für Sie ... aber es ist einfach nicht möglich, ich denke, es war nie nötig, die Fähigkeit hinzuzufügen.

    
Nick Craver 31.12.2010 09:38
quelle
1

In den letzten JS-Versionen gibt es tatsächlich etwas Ähnliches wie Pythons Eigenschaften .

Siehe auch Javascript-Getter und Setter für Dummies?

>

Es mag für Sie genug sein, obwohl Python immer noch viel flexibler und kompakter ist.

    
Marco Mariani 31.12.2010 09:43
quelle
0

Wie andere bereits gesagt haben, ist dies unmöglich, da eine Überlastung des Operators in ECMAscript nicht möglich ist.

Wenn Sie das wirklich tun müssen, würde ich einige Vorverarbeitungen verwenden, um die Teile des Codes ( und nur diejenigen, die wirklich so instrumentiert werden müssen) in instrumentierten Code zu konvertieren.

Dies könnte leicht mit einer kleinen Regexp wie folgt gemacht werden

%Vor%     
Sean Kinsey 31.12.2010 10:24
quelle

Tags und Links