Добавление кода в функцию javascript программным способом

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

var someFunction = function(){
    alert("done");
}

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

Я не совсем уверен, что это возможно, но я решила проверить.

5 ответов


если someFunction глобально доступен, затем вы можете кэшировать функцию, создавать свои собственные и вызывать ее.

Итак, если это оригинал...

someFunction = function() {
    alert("done");
}

ты сделаешь это...

someFunction = (function() {
    var cached_function = someFunction;

    return function() {
        // your code

        var result = cached_function.apply(this, arguments); // use .apply() to call it

        // more of your code

        return result;
    };
})();

вот скрипка


обратите внимание, что я использую .apply для вызова функции кэширование. Это позволяет мне сохранить ожидаемое значение this и передать любые аргументы, которые были переданы в качестве отдельных аргументов, независимо от того, как их было много.


сначала сохраните фактическую функцию в переменной..

var oldFunction = someFunction;

затем задайте свои:

someFunction = function(){
  // do something before
  oldFunction();
  // do something after
};

вы можете создать функцию, которая вызывает ваш код, а затем вызывает функцию.

var old_someFunction = someFunction;
someFunction = function(){
    alert('Hello');
    old_someFunction();
    alert('Goodbye');
}

Я не знаю, можете ли вы обновить функцию, но в зависимости от того, как на нее ссылаются, вы можете сделать новую функцию на ее месте:

var the_old_function = someFunction;
someFunction = function () {
    /* ..My new code... */
    the_old_function();
    /* ..More of my new code.. */
}

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

var t = function() {
    var a = 1;
};

var z = function() {
    console.log(a);
};

теперь

z() // => log: undefined

затем

var ts = t.toString(),
    zs = z.toString();

ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}"));
zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}"));

var z = new Function(ts + "\n" + zs);

и

z() // => log: 1

но это только самый простой пример. Для обработки аргументов, комментариев и возвращаемого значения потребуется еще много работы. Кроме того, есть еще много подводных камней.
toString | фрагмент | indexOf | lastIndexOf | новая функция