Расширение функции JavaScript без переопределения тела текущей функции - PullRequest
0 голосов
/ 27 апреля 2018

Имеют одну функцию, как указано ниже

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

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

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

(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 голосов
/ 27 апреля 2018

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

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

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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...