Добавление кода в функцию 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 | новая функция