Yakın zamanda gönderdiğim başka bir cevaptan, bu V8'de ve JavaScriptCore olduğunu düşünüyorum, ancak Firefox değil ve spesifik değil. İşlemi ve karşılaştırıcıları yakalayabileceğiniz için, çoğu durumda biraz çalışmayla operatör yerel aşırı yüklemesi uygulayabilirsiniz.
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);
Çıktı:
[ { 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 } ]
Bu noktada tüm girdilere ve işlemlere sahip olursunuz, böylece kalan kısım işlemin sonucudur. İşlemin alıcısı dize veya sayı gibi ilkel bir değer alır ve bunu önleyemezsiniz. Bu rastgele bir alıcı değilse, örneğin operatörünüzün aşırı yüklediği sınıfın bir örneğini söyleyin, gelen değeri durdurmak / üzerine yazmayı önlemek için çeşitli get / set tuzaklarını işleyebilirsiniz. İşlenenleri ve işlemi bazı merkezi aramalarda saklayabilir ve basit bir yöntemi, onu üreten işleme geri döndürmek için basit bir yöntem kullanabilir ve ardından özel işleminizi yapmak istediğiniz mantığı oluşturabilirsiniz. Daha sonra karmaşık biçimlere dönüştürülebilecek rastgele alıcılara izin veren başka bir yöntem, verileri karmaşık sınıfınıza geri döndürülebilmesi için ilkel değere kodlamaktır. Diyelim ki 3 farklı 8 bitlik tamsayıdan oluşan bir RGB değeri (255,255,255), başlangıçta tek bir sayıya dönüştürülebilir ve alıcı uç onu karmaşık bileşenlerine geri dönüştürebilir. Veya daha karmaşık veriler için, JSON serileştirilmiş bir dizge bile döndürebilirsiniz.
Harmony Proxy'lerine (Firefox6 +, Nodejs with flag) erişime sahip olmak, tüm bu süreci son derece kolaylaştırır, çünkü temelde her şey için yakalama proxy'leri oluşturabilir ve tüm süreci uçtan uca iç gözlem yapabilir ve istediğinizi yapabilirsiniz. Verilerinizin / sınıfınızın işlenen örnekleri, dahili motorun erişebileceği her olası değerin değeri / toString / alıcıları, önceden farkında olduğunuz herhangi bir alıcı nesnesi ve hatta rastgele alıcıları tuzağa düşürme durumundawith(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }