Расширение функции JavaScript без переопределения тела текущей функции

1

У вас есть одна функция:

function JsFunction(){
//some logic already done by framework library...
}

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

Теги:
inheritance

2 ответа

3
Лучший ответ

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

Обертка функции, которая работает синхронно:

var original = JsFunction;
JsFunction = function JsFunction() {
    // Do stuff before
    // ...
    // Call it
    var result = original.apply(this, arguments);
    // Do stuff after
    // ...
    return result; // Or something else if you prefer
};

Мясо этого

var result = original.apply(this, arguments);

... который использует Function#apply для вызова исходной функции с тем же this, что ваша замена была вызвана и все аргументы, она была вызвана (arguments является специальным псевдо-массивом в JavaScript, содержащий аргументы, используемых при вызове функции традиционной или метод).

С помощью функций ES2015+ вы можете заменить использование arguments параметром rest:

var original = JsFunction;
JsFunction = function JsFunction(...args) {
    // Do stuff before
    // ...
    // Call it
    var result = original.apply(this, args);
    // Do stuff after
    // ...
    return result; // Or something else if you prefer
};
  • 0
    это то, что я точно хотел.
2

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

(function () { // In an IIFE to avoid creating a global variable
    let oldJsFunction = JsFunction;
    JsFunction = function JsFunction() {
        let return_value = oldJsFunction.apply(this, arguments);
        console.log("… and another thing");
        return return_value;
    }
)());
  • 0
    Я думаю, что здесь есть ошибка: JsFunction = function JsFunction() { => JsFunction = function() { ?
  • 0
    @ Сэм: Все хорошо, это выражение с именованной функцией .
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню