J'essaie de personnaliser une bibliothèque JS existante sans modifier le code JS d'origine. Ce code se charge dans quelques fichiers JS externes auxquels j'ai accès, et ce que j'aimerais faire est de changer l'une des fonctions contenues dans le fichier d'origine sans copier et coller le tout dans le deuxième fichier JS.
Ainsi, par exemple, le JS hors limites pourrait avoir une fonction comme celle-ci:
var someFunction = function(){
alert("done");
}
J'aimerais pouvoir en quelque sorte ajouter ou ajouter du code JS dans cette fonction. La raison est principalement que dans le JS original intouchable, la fonction est assez énorme et si ce JS est mis à jour un jour, la fonction avec laquelle je l'écrase sera obsolète.
Je ne suis pas tout à fait sûr que ce soit possible, mais j'ai pensé que je vérifierais.
Réponses:
Si
someFunction
est globalement disponible, vous pouvez mettre en cache la fonction, créer la vôtre et demander à la vôtre de l'appeler.Donc, si c'est l'original ...
Vous feriez ça ...
Voici le violon
Notez que j'utilise
.apply
pour appeler la fonction mise en cache. Cela me permet de conserver la valeur attendue dethis
, et de transmettre les arguments qui ont été transmis en tant qu'arguments individuels, quel que soit le nombre.la source
apply
: c'est la seule réponse qui résout vraiment le problème.funciton
mot - clé JavaScript ? ;) Merci pour la modification.apply()
. Mais s'il s'agissait d'un objet de type Array comme un objet jQuery par exemple, alors oui, certains navigateursstocker d'abord la fonction réelle dans une variable.
puis définissez le vôtre:
la source
apply
pour l'appeler. Voir la réponse de am.someFunction
parwindow.someFunction
le code ci-dessus. La raison en est que ma fonction a été déclarée dans un$(document).ready()
gestionnaire jquery .Vous pouvez créer une fonction qui appelle votre code, puis appelle la fonction.
la source
Je ne sais pas si vous pouvez mettre à jour la fonction, mais selon la façon dont elle est référencée, vous pouvez créer une nouvelle fonction à sa place:
la source
Aussi. Si vous souhaitez modifier le contexte local, vous devez recréer la fonction. Par exemple:
Maintenant
ensuite
Et
Mais ce n'est que l'exemple le plus simple. Il faudra encore beaucoup de travail pour gérer les arguments, les commentaires et la valeur de retour. De plus, il existe encore de nombreux écueils.
toString | tranche | indexOf | lastIndexOf | nouvelle fonction
la source
Le modèle de proxy (tel qu'utilisé par user1106925) peut être placé dans une fonction. Celui que j'ai écrit ci-dessous fonctionne sur des fonctions qui ne sont pas dans la portée globale, et même sur des prototypes. Vous l'utiliseriez comme ceci:
Dans l'extrait ci-dessous, vous pouvez me voir utiliser la fonction pour étendre test.prototype.doIt ().
la source