2015-01-06 3 views
3

Сценарий, который я загружаю, является неправильным. У него есть структура вроде этого:Обезьяна-исправление названной функции, которая называется сразу

function bad_function() { 
    ... 
} 

/* randomly generated stuff */ 

bad_function(); 

Как изменить поведение bad_function, если он немедленно вызвал в конце сценария? Я думал о создании беззвучно свойство только для чтения на window перед загрузкой сценария, но это бросает TypeError: Identifier 'bad_function' has already been declared исключение, когда вышеописанный скрипт выполняется:

Object.defineProperty(window, 'bad_function', { 
    value: function() { 
     /* my monkey-patched code */ 
    } 
}); 

Как я обезьяна патч эта функция?

+0

Вы используете Chrome? Вы сталкиваетесь с конкретной проблемой браузера? –

+0

@jjk_charles: Нет, это браузер-агностик и проблема со сценарием. – Blender

+0

Используете ли вы «defineProperty» в том же JS-файле, что и исходный bad_function(), или они находятся в разных файлах? Если разные файлы, в каком порядке размещен тег

0

Это нехорошо, но все, что я могу сделать, это загрузить скрипт через ajax вместо того, чтобы поместить его в тег <script>, манипулировать строкой результата, чтобы вызвать вашу собственную версию функции (или «переименовать» bad_function это не отменяет версию), затем положить что в <script> тег и добавить его на страницу:

пример использования JQuery для простоты:

function good_function() { 
    alert("I am good"); 
} 

$.ajax({ 
    url: '/echo/html/', 
    type: 'POST', 
    data: { 
     html: "function bad_function() { alert('hahaha'); } bad_function();", 
     delay: 0 
    }, 
    success: function(data) { 
     console.log(data); 

     // comment this line to see the original 
     data = data.replace('bad_function();', 'good_function();') 

     var newScript = $('<script type="text/javascript" />').text(data); 
     $('body').append(newScript); 
    } 
}); 

Working JSFiddle

+0

Переименование 'bad_function' победит всю точку патчей обезьян. – Nit

Смежные вопросы