З іншої відповіді, яку я нещодавно розмістив, це у 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 555) може бути перетворено в одне число на кінці отримання, а кінець приймача може тривіально перетворити його назад у складні компоненти. Або для більш складних даних ви можете навіть повернути серіалізований рядок JSON.
Наявність доступу до проксі-серверів Harmony (Firefox6 +, Nodejs з прапором) надзвичайно полегшує весь цей процес, оскільки ви можете створювати проксі-сервери для захоплення практично всього і проаналізувати весь процес від кінця до кінця і робити все, що завгодно. Екземпляри операндів ваших даних / класу, valueOf / toString / getters кожного можливого значення, до якого може мати доступ внутрішній механізм, будь-який об'єкт приймача, про який ви попередньо обізнані, і навіть захоплюють довільні приймачі у випадкуwith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }