Я уверен, что с более широким взглядом на то, что вы на самом деле пытаетесь сделать, и на контекст, в котором вы это делаете, мы могли бы дать вам лучший ответ, чем буквальный ответ на ваш вопрос.
Но вот дословный ответ:
Если вы где-то назначаете эти функции какому-либо свойству, вы можете обернуть исходную функцию и вместо этого поместить свою замену в свойство:
var theProperty = init;
function init(){
doSomething();
}
theProperty = (function(old) {
function extendsInit() {
old();
doSomething();
}
return extendsInit;
})(theProperty);
Если ваших функций еще нет на объекте, вы, вероятно, захотите разместить их там, чтобы облегчить описанное выше. Например:
var MyLibrary = {
init: function init() {
}
};
(function() {
var oldInit = MyLibrary.init;
MyLibrary.init = extendedInit;
function extendedInit() {
oldInit.call(MyLibrary);
doSomething();
}
})();
Но есть способы сделать это лучше. Как, например, предоставление средств регистрации init
функций.
var MyLibrary = (function() {
var initFunctions = [];
return {
init: function init() {
var fns = initFunctions;
initFunctions = undefined;
for (var index = 0; index < fns.length; ++index) {
try { fns[index](); } catch (e) { }
}
},
addInitFunction: function addInitFunction(fn) {
if (initFunctions) {
initFunctions.push(fn);
} else {
setTimeout(fn, 0);
}
}
};
})();
Здесь, в 2020 году (или в любое время после ~ 2016 года), это можно записать более компактно:
const MyLibrary = (() => {
let initFunctions = [];
return {
init() {
const fns = initFunctions;
initFunctions = undefined;
for (const fn of fns) {
try { fn(); } catch (e) { }
}
},
addInitFunction(fn) {
if (initFunctions) {
initFunctions.push(fn);
} else {
setTimeout(fn, 0);
}
}
};
})();