При отладке или деобфускации джаваскриптовских программ зачастую возникает необходимость перенаправить какие-то функции на свой код. Простейший пример: Code: var oldEval = window.eval; eval = function(x) { alert(x); return oldEval(x); } С помощью такого нехитрого приема ломается 90% кода, криптованного непрофессионалами. К сожалению, такой хук легко обнаруживается простым вызовом функции toString() Было: Code: >eval.toString() function eval() { [native code] } Стало: Code: >eval.toString() function(x) { alert(x); return oldEval(x); } Палимся! Что делать? Почему бы не переписать саму функцию toString()? Code: var oldEval = window.eval; eval = function(x) { alert(x); return oldEval(x); } eval.toString = function() { return "function eval() { [native code] }"; } Уже лучше, но умный противник может проверить и toString. Переписывать toString.toString? А потом и toString.toString.toString? Решаем проблему раз и навсегда при помощи небольшого трюка с рекурсией: Code: var fake = (function() { function closure(str) { return function() { return str; }; } function clone(f) { return function() { return f.apply(this, arguments); }; } // Переписываем базовый toString var base = closure({}.toString+''); base.toString = base; // Создаем функцию с поддельным toString return function(newFunc, oldFunc) { var f = clone(newFunc); f.toString = closure(oldFunc+''); f.toString.toString = base; return f; }; })(); Пример использования: Code: var newAlert = function(x) { console.log(x); } window.alert = fake(newAlert,window.alert); alert("test"); На консоль выводится "test" Code: >alert.toString() function alert() { [native code] } >alert.toString.toString() function toString() { [native code] } Как ни в чем ни бывало!