Ответ 1
С более широким представлением о том, что вы на самом деле пытаетесь сделать, и в контексте, в котором вы это делаете, я уверен, что мы могли бы дать вам лучший ответ, чем буквальный ответ на ваш вопрос.
Но вот буквальный ответ:
Если вы назначаете эти функции некоторому свойству где-то, вы можете обернуть исходную функцию и вместо этого поместить свою замену в свойство:
// 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);
Если ваши функции еще не находятся на объекте, вы, вероятно, захотите разместить их там, чтобы облегчить это. Например:
// 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();
}
})();
Но есть такие лучшие способы сделать это. Например, как средство регистрации функций init
.
// 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;
})();
(Большая часть из приведенного выше может быть написана немного более компактно, но я хотел использовать четкие имена, такие как publicSymbols
, а не обычный обычный литерал pubs
или анонимный объект. Вы можете записать его намного компактнее, если хотите иметь анонимные функции, но Мне не нравятся анонимные функции.)