Из другого ответа, который я недавно опубликовал, это в V8, и я думаю, что JavaScriptCore, но не Firefox, и это не спецификация.Поскольку вы можете перехватить операцию и компараторы, вы можете реализовать собственную перегрузку оператора в большинстве ситуаций с небольшим трудом.
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);
Вывод:
[ { 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 } ]
На данный момент у вас есть всевходы и операции, поэтому оставшаяся часть является результатом операции.Получатель операции получит примитивное значение, либо строку, либо число, и вы не можете предотвратить это.Если это не произвольный получатель, скажем, экземпляр класса, который вы перегрузили оператором, вы можете обрабатывать различные ловушки get / set для перехвата входящего значения / предотвращения перезаписи.Вы можете сохранить операнды и операцию в некотором централизованном поиске и использовать простой метод, чтобы отследить примитивное значение до операции, которая его произвела, а затем создать любую логику, которую вы хотите выполнить в своей пользовательской операции.Другой метод, который позволит произвольным получателям, которые впоследствии могут быть преобразованы в сложные формы, заключался бы в кодировании данных в примитивное значение, чтобы их можно было вернуть обратно в ваш сложный класс.Например, значение RGB из 3 различных 8-битных целых чисел (255 255 255) может быть преобразовано в одно число на стороне получения, а сторона-получатель может просто преобразовать его обратно в сложные компоненты.Или для более сложных данных вы могли бы даже вернуть сериализованную строку JSON.
Наличие доступа к прокси-серверам Harmony (Firefox6 +, Nodejs с флагом) значительно упрощает весь этот процесс, поскольку вы можете создавать прокси-ловушки практически для всего и для самоанализавесь процесс от конца до конца и делай что хочешь.Экземпляры операндов ваших данных / класса, значения valueOf / toString / getters каждого возможного значения, к которому может обращаться внутренний механизм, любой объект-получатель, о котором вы предварительно осведомлены, и даже перехватывание произвольных получателей в случае with(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }