Подтвердить что ты не робот

JS: Вызов функции за другим, не касаясь исходной функции?

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

Сторонняя библиотека имеет:

function eventFinished(args){
    //library stuff here
}

Теперь, если это был мой собственный код, я бы сделал что-то вроде этого:

function eventFinished(args){
    //library stuff here
    MyCustomFunction();
}

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

EDIT: я должен упомянуть, что объявленная функция доступна по всему миру.

4b9b3361

Ответ 1

Если у вас есть способ получить ссылку на функцию, которую вы хотите расширить, вы можете "обезьяна-патч" это сделать так:

var fnOriginalFunction = functionYouWantToExtend;
functionYouWantToExtend = function() {
    fnOriginalFunction.apply(this, arguments);

    // your code here
};

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

Дополнительная информация о обезглавливании.

Ответ 2

"Я пытаюсь расширить стороннюю библиотеку на определенной странице, но я не хочу менять какой-либо код третьей стороны"

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

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

Например:

const Library = {
  method() {
    console.log('I am the library method');
  }
}

const unalteredMethod = Library.method;
Library.method = function() {
  unalteredMethod.apply(this, arguments);
  console.log('my custom behavior');
}

Library.method();