I was looking into how paper.js did their operator overloading and what I found was pretty clever:
var operators = { '+': 'add', '-': 'subtract', '*': 'multiply', '/': 'divide', '%': 'modulo', '==': 'equals', '!=': 'equals' }; function $eval(left, operator, right) { var handler = operators[operator]; if (left && left[handler]) { var res = left[handler](right); return operator == '!=' ? !res : res; } switch (operator) { case '+': return left + right; case '-': return left - right; case '*': return left * right; case '/': return left / right; case '%': return left % right; case '==': return left == right; case '!=': return left != right; default: throw new Error('Implement Operator: ' + operator); } };
Though technically this is PaperScript and not JavaScript, so they can get around the lack of native JS operator overloading. The PaperScript code is given a minimal compile pass which replaces calls to arithmetic operators with calls to $eval()
.
// PaperScript var p = new Point(10, 20); var r = p * 5; // JavaScript var p = new Point(10, 20); var r = $eval(p, "*", 5);
So as long as Point#multiply is defined then the operator is effectively overloaded.
I’m very interested in the implications for PixieEngine and CoffeeScript.