Z innej odpowiedzi, którą niedawno opublikowałem, jest to wersja 8 i myślę, że JavaScriptCore, ale nie Firefox i nie jest to specyfikacja. Ponieważ możesz przechwytywać operację i komparatory, możesz zaimplementować natywne przeciążanie operatora w większości sytuacji przy odrobinie pracy.
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);
Wynik:
[ { 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 } ]
W tym momencie masz wszystkie dane wejściowe i operację, więc pozostała część jest wynikiem operacji. Odbiorca operacji otrzyma wartość pierwotną, ciąg lub liczbę, i nie można temu zapobiec. Jeśli nie jest to dowolny odbiorca, powiedzmy instancja klasy, którą przeciążasz operator, możesz obsługiwać różne pułapki pobierania / ustawiania, aby przechwycić przychodzącą wartość / zapobiec nadpisaniu. Możesz przechowywać operandy i operacje w jakimś centralnym wyszukiwaniu i użyć prostej metody, aby prześledzić pierwotną wartość z powrotem do operacji, która ją wygenerowała, a następnie utworzyć dowolną logikę, którą chcesz wykonać niestandardową operację. Inną metodą, która pozwoliłaby na dowolne odbiorniki, które można później odtworzyć w złożone formy, byłoby zakodowanie danych do wartości pierwotnej, aby można je było przywrócić z powrotem do klasy złożonej. Na przykład wartość RGB 3 różnych 8-bitowych liczb całkowitych (255,255,255) może zostać przekonwertowana na pojedynczą liczbę na końcu pobierania, a koniec odbiornika może trywialnie przekształcić ją z powrotem w złożone elementy. Lub w przypadku bardziej złożonych danych możesz nawet zwrócić serializowany ciąg JSON.
Dostęp do serwerów proxy Harmony (Firefox6 +, Nodejs z flagą) sprawia, że cały ten proces jest znacznie łatwiejszy, ponieważ możesz tworzyć proxy pułapki w zasadzie na wszystkim i przeglądać cały proces od końca do końca i robić, co chcesz. Instancje operandów danych / klasy, valueOf / toString / getters każdej możliwej wartości, do której silnik wewnętrzny może uzyskać dostęp, dowolnego obiektu odbiornika, o którym masz wcześniejszą świadomość, a nawet pułapki arbitralnewith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }