La raison principale pour laquelle je le souhaite est que je souhaite étendre ma fonction d'initialisation.
Quelque chose comme ça:
// main.js
window.onload = init();
function init(){
doSomething();
}
// extend.js
function extends init(){
doSomethingHereToo();
}
Je veux donc étendre une fonction comme j'étends une classe en PHP.
Et je voudrais également l'étendre à partir d'autres fichiers, donc par exemple, j'ai la fonction init originale dans main.js
et la fonction étendue dans extended.js
.
javascript
function
extend
Adam Halasz
la source
la source
Réponses:
Avec une vision plus large de ce que vous essayez réellement de faire et du contexte dans lequel vous le faites, je suis sûr que nous pourrions vous donner une meilleure réponse que la réponse littérale à votre question.
Mais voici une réponse littérale:
Si vous affectez ces fonctions à une propriété quelque part, vous pouvez encapsuler la fonction d'origine et placer votre remplacement sur la propriété à la place:
Si vos fonctions ne sont pas déjà sur un objet, vous voudrez probablement les y placer pour faciliter ce qui précède. Par exemple:
Mais il y a ces meilleures façons de le faire. Comme par exemple, fournir un moyen d'enregistrer des
init
fonctions.(Une grande partie de ce qui précède pourrait être écrite un peu plus compacte, mais je voulais utiliser des noms clairs comme
publicSymbols
plutôt que monpubs
objet littéral habituel ou anonyme. Vous pouvez l'écrire de manière beaucoup plus compacte si vous voulez avoir des fonctions anonymes, mais je ne le fais pas. t beaucoup de soin pour les fonctions anonymes .)la source
Il y a plusieurs façons de procéder, cela dépend de votre objectif, si vous souhaitez simplement exécuter la fonction également et dans le même contexte, vous pouvez utiliser
.apply()
:Si vous souhaitez le remplacer par un plus récent
init
, cela ressemblerait à ceci:la source
.call
méthode à la place de.apply
. Consultez cette question StackOverflow.Les autres méthodes sont excellentes mais elles ne conservent aucune fonction prototype attachée à init. Pour contourner cela, vous pouvez faire ce qui suit (inspiré du message de Nick Craver).
la source
Une autre option pourrait être:
la source
C'est très simple et direct. Regardez le code. Essayez de saisir le concept de base derrière l'extension javascript.
Commençons par étendre la fonction javascript.
Vous pouvez étendre cette fonction en créant une fonction enfant de la manière suivante
Vous pouvez maintenant utiliser la fonction enfant comme suit,
Nous pouvons également créer une fonction Javascript en étendant les classes Javascript, comme ceci.
Étendons cette classe avec la fonction Child comme ceci,
Encore une fois, vous pouvez utiliser la fonction enfant comme suit pour obtenir un résultat similaire,
Javascript est un langage très simple. On peut presque tout faire. Joyeux JavaScript ... J'espère avoir pu vous donner une idée à utiliser dans votre cas.
la source
Utilisez extendFunction.js
Mais dans votre cas spécifique, il est plus facile d'étendre la fonction globale onload:
En fait, j'aime beaucoup votre question, elle me fait réfléchir à différents cas d'utilisation.
Pour les événements javascript, vous voulez vraiment ajouter et supprimer des gestionnaires - mais pour extendFunction, comment pourriez-vous supprimer ultérieurement des fonctionnalités? Je pourrais facilement ajouter une méthode .revert aux fonctions étendues, donc
init = init.revert()
je retournerais la fonction d'origine. Évidemment, cela pourrait conduire à un code assez mauvais, mais peut-être que cela vous permet de faire quelque chose sans toucher à une partie étrangère de la base de code.la source