Как можно динмически изменить строку функции JavaScript? - PullRequest
5 голосов
/ 13 августа 2010

Предположим, у меня была следующая функция:

function alertMesg()
{
   alert("This ok function alerts message!");
}

Теперь во время выполнения я хотел бы изменить функцию alertMesg, чтобы сделать что-то еще.Я думал сделать что-то вроде этого.

var temp = window.alertMesg.toString.replace("ok","great")
temp = temp.replace('function alertMesg()',"");
window.alertMesg = new Function(temp);

По сути, проблема в том, что я не могу контролировать источник в функции alertMesg.Я хотел бы изменить функцию, но на самом деле я не могу изменить ее источник, потому что он создается на стороне сервера.При этом, мне нужно, чтобы он действовал по-другому.

PS: я забыл упомянуть важную часть: я должен сохранить большую часть функции.Я не могу просто заменить функцию правильно.Мне нужно сохранить 95% функции такой, какая она есть, и изменить остальные пять процентов.

@ Барлоу Такер, quixoto, pekka Спасибо за интерес.

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

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

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

function alertMesg()
{
   alert ("This ok function alerts my message!");
}

alertMesg(); // alerts "This ok function alerts my message!"

// do whatever you want to the function here
var temp = alertMesg.toString();
temp = temp.replace('my', 'your');

// now replace the original function
alertMesg=new Function(temp.substring(temp.indexOf('{')+1,temp.lastIndexOf('}')));

alertMesg(); // alerts "This ok function alerts your message!"

Вероятно, это не лучший способ сделать то, что вы пытаетесь достичь, но я не могу предложить что-то еще, если вы не предоставите больше информации.

4 голосов
/ 13 августа 2010

Динамическая замена кода, как вы и предполагали, в некоторых случаях может сработать, но идти по пути страшно - хрупко, один неверный шаг, и вы обанкротились, и это быстро превращается в кошмар обслуживания.

Как сказал комментатор, ваша более чистая ставка заключается в том, чтобы просто обернуть нативный window.alert, а затем делать правильные вещи, когда проходит строка, о которой вы заботитесь, согласно ответу здесь: JavaScript: предупреждение о переопределении ()

(Вставьте здесь стандартный комментарий о том, как вы должны размещать своих серверных людей на той же странице / команде, что и вы, чтобы вам не приходилось взламывать собственную страницу.)

ОБНОВЛЕНИЕ: Вы не спрашиваете об оповещении, вы спрашиваете об этой проблеме вообще. Да, вы могли бы то, что предлагают другие. Но если у вас есть оригинальный код для функции, почему бы просто не заменить его полностью? Если вы хотите использовать глобальную функцию с именем foo(), вы можете запустить JS, которая выполняет:

window.foo = function() {
    // The stuff I know is there (A)
    ...
    // Some new stuff I want to change (B)
    ...
    // More stuff I know is there (C)
}

Который выбросит оригинал и заменит его вашей версией. Это будет работать достаточно хорошо, хотя «исправление обезьян» на странице определенно сопровождается некоторыми проблемами с обслуживанием.

Я определенно отмечу здесь, что если вы по какой-то причине не можете сделать это и, следовательно, настаиваете на замене текстового кода в середине существующих функций , вы злоупотребляете языком / средой для цели ремонтопригодны что-нибудь, и вы действительно облажались несколькими способами.

...