Dari jawaban lain yang baru saya posting, ini ada di V8 dan saya pikir JavaScriptCore, tetapi bukan Firefox dan itu bukan spesifikasi. Karena Anda dapat menangkap operasi dan pembanding, Anda dapat mengimplementasikan overloading bawaan operator dalam banyak situasi dengan sedikit usaha.
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);
Keluaran:
[ { 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 } ]
Pada titik ini Anda memiliki semua input dan operasi sehingga bagian yang tersisa adalah hasil dari operasi tersebut. Penerima operasi akan mendapatkan nilai primitif, baik string atau angka, dan Anda tidak dapat mencegahnya. Jika ini bukan penerima arbitrer, katakanlah sebuah instance dari kelas yang telah Anda overload oleh operator, Anda dapat menangani berbagai get / set traps untuk mencegat nilai yang masuk / mencegah penimpaan. Anda dapat menyimpan operand dan operasi di beberapa pencarian pusat dan menggunakan metode sederhana untuk melacak kembali nilai primitif ke operasi yang memproduksinya, lalu membuat logika apa pun yang Anda inginkan untuk melakukan operasi kustom. Metode lain yang memungkinkan penerima arbitrer yang nantinya dapat disusun kembali menjadi bentuk kompleks adalah dengan menyandikan data ke dalam nilai primitif sehingga dapat dikembalikan ke kelas kompleks Anda. Seperti katakanlah nilai RGB dari 3 bilangan bulat 8bit berbeda (255.255.255) dapat diubah menjadi satu nomor di ujung get dan ujung penerima dapat dengan mudah mengubahnya kembali menjadi komponen kompleksnya. Atau untuk data yang lebih kompleks, Anda bahkan dapat mengembalikan string serial JSON.
Memiliki akses ke Harmony Proxies (Firefox6 +, Nodejs with flag) membuat seluruh proses ini sangat mudah, karena Anda dapat membuat proxy yang menjebak pada dasarnya semua dan introspeksi seluruh proses dari ujung ke ujung dan melakukan apa pun yang Anda inginkan. Instance operan data / kelas Anda, valueOf / toString / getter dari setiap kemungkinan nilai yang dapat diakses mesin internal, objek penerima apa pun yang Anda ketahui sebelumnya, dan bahkan menjebak penerima arbitrer dalam kasuswith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }