Aus einer anderen Antwort, die ich kürzlich gepostet habe, geht hervor, dass dies in V8 ist und ich denke, JavaScriptCore, aber nicht Firefox und es ist keine Spezifikation. Da Sie die Operation und die Komparatoren abfangen können, können Sie in den meisten Situationen mit ein wenig Arbeit eine native Überladung des Operators implementieren.
var actions = [];
var overload = {
valueOf: function(){
var caller = arguments.callee.caller;
actions.push({
operation: caller.name,
left: caller.arguments[0] === this ? "unknown" : this,
right: caller.arguments[0]
});
return Object.prototype.toString.call(this);
}
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);
Ausgabe:
[ { operation: 'EQUALS',
left: overload,
right: 10 },
{ operation: 'MUL',
left: overload,
right: 10 },
{ operation: 'DIV',
left: 'unknown',
right: overload },
{ operation: 'IN',
left: overload,
right: DOMWindow },
{ operation: 'UNARY_MINUS',
left: overload,
right: undefined },
{ operation: 'TO_NUMBER',
left: overload,
right: undefined },
{ operation: 'COMPARE',
left: overload,
right: 5 },
{ operation: 'COMPARE',
left: 'unknown',
right: overload },
{ operation: 'ToString',
left: 'unknown',
right: overload } ]
Zu diesem Zeitpunkt haben Sie alle Eingaben und die Operation, sodass der verbleibende Teil das Ergebnis der Operation ist. Der Empfänger der Operation erhält einen primitiven Wert, entweder eine Zeichenfolge oder eine Zahl, und Sie können dies nicht verhindern. Wenn es sich nicht um einen willkürlichen Empfänger handelt, z. B. um eine Instanz der Klasse, die Ihr Operator überladen hat, können Sie verschiedene get / set-Traps verarbeiten, um den eingehenden Wert abzufangen / ein Überschreiben zu verhindern. Sie können die Operanden und Operationen in einer zentralen Suche speichern und mithilfe einer einfachen Methode einen primitiven Wert auf die Operation zurückführen, die ihn erzeugt hat, und dann die Logik erstellen, die Sie für Ihre benutzerdefinierte Operation ausführen möchten. Eine andere Methode, die beliebige Empfänger ermöglicht, die später in komplexe Formen rekonstituiert werden könnten, besteht darin, die Daten in den primitiven Wert zu codieren, damit sie wieder in Ihre komplexe Klasse umgewandelt werden können. Wie gesagt, ein RGB-Wert von 3 verschiedenen 8-Bit-Ganzzahlen (255,255,255) könnte am get-Ende in eine einzelne Zahl umgewandelt werden, und das Empfängerende könnte ihn trivial wieder in seine komplexen Komponenten umwandeln. Bei komplexeren Daten können Sie sogar eine serialisierte JSON-Zeichenfolge zurückgeben.
Der Zugriff auf Harmony Proxies (Firefox6 +, Nodejs mit Flag) erleichtert diesen gesamten Prozess erheblich, da Sie Trapping-Proxys für praktisch alles erstellen und den gesamten Prozess von Ende zu Ende überprüfen und tun können, was Sie wollen. Die Operandeninstanzen Ihrer Daten / Klasse, der Wert von / toString / Getter für jeden möglichen Wert, auf den die interne Engine zugreifen kann, jedes Empfängerobjekt, das Sie bereits kennen, und im Fall von sogar beliebige Empfänger abfangenwith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }