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%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% 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.
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.
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.
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%Tags und Links javascript