Avec une vue plus large de ce que vous êtes réellement en train de faire et le contexte dans lequel vous le faites, je suis sûr que nous pourrions vous donner une meilleure réponse que le littéral réponse à votre question.
Mais ici, c'est un littéral de réponse:
Si vous êtes à l'attribution de ces fonctions à une propriété quelque part, vous pouvez enrouler la fonction d'origine et de mettre votre remplacement sur la propriété à la place:
// Original code in main.js
var theProperty = init;
function init(){
doSomething();
}
// Extending it by replacing and wrapping, in extended.js
theProperty = (function(old) {
function extendsInit() {
old();
doSomething();
}
return extendsInit;
})(theProperty);
Si vos fonctions ne sont pas déjà sur un objet, vous souhaiterez probablement de les mettre là pour faciliter la ci-dessus. Par exemple:
// In main.js
var MyLibrary = (function() {
var publicSymbols = {};
publicSymbols.init = init;
function init() {
}
return publicSymbols;
})();
// In extended.js
(function() {
var oldInit = MyLibrary.init;
MyLibrary.init = extendedInit;
function extendedInit() {
oldInit.apply(MyLibrary); // Use #apply in case `init` uses `this`
doSomething();
}
})();
Mais il y a ces meilleures façons de le faire. Comme par exemple, en fournissant un moyen de l'enregistrement d' init
fonctions.
// In main.js
var MyLibrary = (function() {
var publicSymbols = {},
initfunctions = [];
publicSymbols.init = init;
function init() {
var funcs = initFunctions;
initFunctions = undefined;
for (index = 0; index < funcs.length; ++index) {
try { funcs[index](); } catch (e) { }
}
}
publicSymbols.addInitFunction = addInitFunction;
function addInitFunction(f) {
if (initFunctions) {
// Init hasn't run yet, rememeber it
initFunctions.push(f);
}
else {
// `init` has already run, call it almost immediately
// but *asynchronously* (so the caller never sees the
// call synchronously)
setTimeout(f, 0);
}
}
return publicSymbols;
})();
(Une grande partie de la ci-dessus pourrait être écrit un peu plus compacte, mais je voulais utiliser des noms comme publicSymbols
plutôt qu'à mon habitude, pubs
ou anonymes objet littéral. Vous pouvez écrire beaucoup plus compacte si vous voulez avoir les fonctions anonymes, mais je n'ai pas beaucoup de soins pour les fonctions anonymes.)