Я пытаюсь настроить существующую библиотеку JS, не изменяя исходный код JS. Этот код загружается в несколько внешних JS-файлов, к которым у меня есть доступ, и я хотел бы изменить одну из функций, содержащихся в исходном файле, без копирования и вставки всего этого во второй JS-файл.
Так, например, закрытый JS может иметь такую функцию:
var someFunction = function(){
alert("done");
}
Я хотел бы иметь возможность каким-то образом добавить или добавить некоторый JS-код в эту функцию. Причина в первую очередь в том, что в оригинальном неприкасаемом JS функция довольно огромна, и если этот JS когда-либо будет обновлен, функция, которую я перезапишу, будет устаревшей.
Я не совсем уверен, что это возможно, но решил проверить.
Ответы:
Если
someFunction
она доступна глобально, вы можете кэшировать функцию, создать свою собственную и вызвать ее.Так что если это оригинал ...
Ты бы сделал это ...
Вот скрипка
Обратите внимание, что я использую
.apply
для вызова кешированной функции. Это позволяет мне сохранять ожидаемое значениеthis
и передавать любые аргументы, которые были переданы как отдельные аргументы, независимо от того, сколько их было.источник
apply
: это единственный ответ, который действительно решает проблему.funciton
ключевым словом JavaScript ? ;) Спасибо за правку.apply()
. Но если бы это был объект, подобный массиву, например объект jQuery, то да, некоторые браузерысначала сохраните фактическую функцию в переменной ..
затем определите свой собственный:
источник
apply
для ее вызова. См. Ответ.someFunction
сwindow.someFunction
в коде выше. Причина в том, что моя функция была объявлена внутри$(document).ready()
обработчика jquery .Вы можете создать функцию, которая вызывает ваш код, а затем вызывает функцию.
источник
Я не знаю, можете ли вы обновить функцию, но в зависимости от того, как на нее ссылаются, вы можете создать новую функцию вместо нее:
источник
Также. Если вы хотите изменить локальный контекст, вам нужно воссоздать функцию. Например:
Сейчас
затем
И
Но это самый простой пример. Для обработки аргументов, комментариев и возвращаемого значения потребуется еще много работы. К тому же есть еще много подводных камней.
toString | ломтик | indexOf | lastIndexOf | новая функция
источник
Шаблон прокси (используемый пользователем user1106925) можно поместить внутри функции. Тот, который я написал ниже, работает с функциями, которые не входят в глобальную область видимости, и даже с прототипами. Вы бы использовали это так:
Во фрагменте ниже вы можете увидеть, как я использую функцию для расширения test.prototype.doIt ().
источник