Từ một câu trả lời khác mà tôi đã đăng gần đây, đây là trong V8 và tôi nghĩ JavaScriptCore, nhưng không phải Firefox và nó không phải là thông số kỹ thuật. Vì bạn có thể bẫy hoạt động và bộ so sánh, bạn có thể thực hiện nạp chồng toán tử gốc trong hầu hết các tình huống với một chút công việc.
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);
Đầu ra:
[ { 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 } ]
Tại thời điểm này, bạn có tất cả các đầu vào và hoạt động nên phần còn lại là kết quả của hoạt động. Người nhận của hoạt động sẽ nhận được một giá trị nguyên thủy, là chuỗi hoặc số và bạn không thể ngăn điều này. Nếu đó không phải là bộ nhận tùy ý, giả sử một phiên bản của lớp mà bạn đã nạp chồng toán tử, bạn có thể xử lý các bẫy nhận / đặt khác nhau để chặn giá trị đến / ngăn ghi đè. Bạn có thể lưu trữ các toán hạng và hoạt động trong một số tra cứu trung tâm và sử dụng một phương pháp đơn giản để theo dõi một giá trị nguyên thủy trở lại hoạt động tạo ra nó, sau đó tạo bất kỳ logic nào bạn muốn để thực hiện hoạt động tùy chỉnh của mình. Một phương pháp khác sẽ cho phép các máy thu tùy ý mà sau này có thể được hoàn nguyên thành các dạng phức hợp là mã hóa dữ liệu thành giá trị nguyên thủy để nó có thể được đảo ngược trở lại lớp phức hợp của bạn. Giống như nói một giá trị RGB của 3 số nguyên 8bit riêng biệt (255,255,255) có thể được chuyển đổi thành một số duy nhất ở đầu nhận và đầu nhận có thể chuyển đổi nó trở lại thành các thành phần phức tạp. Hoặc đối với dữ liệu phức tạp hơn, bạn thậm chí có thể trả về một chuỗi được tuần tự hóa JSON.
Việc có quyền truy cập vào Harmony Proxy (Firefox6 +, Nodejs with flag) làm cho toàn bộ quá trình này trở nên dễ dàng hơn nhiều, vì bạn có thể tạo các proxy bẫy về cơ bản mọi thứ và xem xét toàn bộ quá trình từ đầu đến cuối và làm bất cứ điều gì bạn muốn. Các thể hiện toán hạng của dữ liệu / lớp của bạn, giá trị valueOf / toString / getters của mọi giá trị có thể mà bộ máy bên trong có thể truy cập, bất kỳ đối tượng người nhận nào bạn đã biết trước và thậm chí bẫy người nhận tùy ý trong trường hợpwith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }