2014-08-31 3 views
2

У меня есть два сценария, но я не могу получить доступ к одному из них. Как отредактировать содержимое функции без ее перезаписи?Как отредактировать функцию без перезаписи ее содержимого?

Пример:

Я знаю, что это может изменить функцию:

<script> 
function a() { 
alert('hi'); 
} 
</script> 
<script> 
function a() { 
alert('hi'); 
console.log('hi'); 
} 
</script> 

Но я не хочу снова переписать "предупреждение ('привет')".

+0

Какой текстовый редактор вы используете для редактирования этой функции? –

+0

Вы хотите добавить функциональность к функции? То есть, вы хотите делать то, что он уже делает, плюс что-то еще? –

+0

Просто * над * пишите? – Bergi

ответ

3

Вы можете украсть символ функции, как и это:

var b = a;    // <== Takes the original `a` and remembers it as `b` 
a = function() {  // <== Assigns a new function to `a` 
    var rv = b();  // <== Calls what used to be `a`, remembers its return value 
    console.log("hi"); 
    return rv;   // <== Returns what the old function returned 
}; 

Конечно, если вам не нужен возврат стоимость вещи, вы можете оставить его, но если вы притворяясь старая функция, вероятно, лучше всего вернуть то, что она возвращает.

Если вам нужно передать аргументы к нему и просто хочу, чтобы передать все аргументов ваша новая функция получает, вы можете сделать это с Function#apply и специальной arguments псевдо-массива:

var b = a; 
a = function() { 
    var rv = b.apply(this, arguments); // Calls the original `a` with the current 
             // `this` and all the args we were given 
    console.log("hi"); 
    return rv; 
}; 
0

Попробуйте это: установить новую функцию к старому, а затем переназначить старое:

function a() { 
    alert('hi'); 
} 
b = a; 
a = function() 
{ 
    b(); 
    console.log('hi'); 
} 
a(); 

Обратите внимание, что вы должны назначить новый a, используя выражение: a = function()... Если вы только что сделали function a()..., вы получите рекурсию и превысите максимальный размер стека вызовов.

0

Другой вариант заключается переопределить источник функции по поиску & заменить:

eval(a.toString().replace(/(alert\(\'hi\'\)\;)/,"$1\nconsole.log('hi');")); 
0

Вы можете сериализовать исходную функцию в строку, построить новую и добавить новую строку к нему:

function a() { 
    alert('a'); 
} 

var b = new Function('(' + a + ")(); alert('b');") 

b(); // would alert twice, 'a' & 'b' 
Смежные вопросы