1
votes

Composition de fonction: Augmenter une fonction existante avec une fonction supplémentaire en Javascript

J'importe une bibliothèque avec une fonction et je voudrais remplacer cette fonction par une fonction qui prend la fonction d'origine comme argument avec une fonction supplémentaire.

La fonction d'origine pourrait être logThis:

logThis = compose(logThis, logThat);

Je peux créer une nouvelle fonction qui exécute logThis et enregistre ensuite 'that';

function logThisThenThat() {
  logThis();
  console.log('that');
}

Je voudrais remplacer logThis par une nouvelle fonction qui exécute la fonction d'origine et par la suite une autre fonction? Est-ce possible avec la composition de fonctions ou vais-je devoir créer une nouvelle fonction avec un nom différent qui est composé de la fonction d'origine et des fonctions supplémentaires.

Quelque chose du genre:

function logThis() {console.log('this'));


0 commentaires

3 Réponses :


1
votes

Vous pouvez remplacer la fonction existante par une nouvelle.

Conservez une copie de l'original comme ceci ...

function logThis() {
    _logThis();
    // your other function call or new code goes here
}

... puis faites votre la nouvelle version appelle la version d'origine ...

_logThis = logThis;

Ce n'est pas une bonne idée, car cela modifiera ce qui se passe pour chaque appel existant em> à cette méthode. Cela doit être manipulé avec précaution.

De plus, la portée est un facteur important ici. Voici un exemple de base de ce que vous essayez de faire.


2 commentaires

C'est exactement ce que j'ai fait et cela fonctionne. Je pensais que cela avait l'air assez pythonique et qu'il pourrait y avoir une autre méthode plus javascript.


Je doute que vous voyiez jamais l'extension des fonctions comme une chose native car c'est si simple à faire. Je suis sûr qu'il existe des bibliothèques tierces qui lui donnent un aspect moelleux, mais cela fera ^^ cela au niveau le plus bas.



1
votes

Si vous passez logThis () dans votre fonction compose () , vous en garderez une référence dans la fermeture, donc il restera lorsque vous faites un nouveau logThis () . Le nom n'est pas vraiment important tant que vous renommez dans un ordre qui vous permet d'obtenir la référence à l'ancien logThis () avant de pointer le nom vers une nouvelle fonction. Par exemple, le côté droit de logThis = compose (logThis, logThat) s'exécute avant l'attribution de nom ci-dessous, vous capturez donc la référence de la fonction avant de réaffecter le nom:

function logThis() {console.log('this')};
function logThat() {console.log('that')};

let compose = (f1, f2) => () => {
    f1()
    f2()
}

logThis = compose(logThis, logThat)
logThis()


3 commentaires

excellent ... c'est exactement ce que je recherchais. est-il possible de faire fonctionner cela avec n nombre de fonctions au lieu de seulement deux? bien que dans mon cas d'utilisation actuel, je n'en ai besoin que de deux et je pourrais simplement ajouter plus de fonctions une par une.


Ouais @DennisBauszus, il vous suffit de passer un tableau de fonctions ou de capturer tous les arguments. Quelque chose comme let compose = (... fns) => () => fns.forEach (f => f ())


Cool ... Je viens de voir la dernière réponse de manuerumx qui a suggéré la même chose. Fonctionne un régal. Merci.



1
votes

Vous pouvez créer une fonction comme celle-ci.

function logThis() {
	console.log("this");
}

function logThat() {
	console.log("that");
}

let compose = (...func) => ()=> {
	let functions = func;
	functions.forEach((fn) => fn());
}

logThis = compose(logThis, logThat);
logThis();

En ajoutant (... func) comme paramètres, vous pouvez exécuter 3, 4 toutes les fonctions que vous aimez / dont vous avez besoin.

Remarque: Modifiez l'extrait de code pour qu'il corresponde à la question. La réponse sélectionnée par @ mark-meyer est correcte.


0 commentaires