Шаблон прокси (используемый user1106925) может быть помещен в функцию.Тот, который я написал ниже, работает с функциями, которые не входят в глобальную область, и даже с прототипами.Вы могли бы использовать это так:
extender(
objectContainingFunction,
nameOfFunctionToExtend,
parameterlessFunctionOfCodeToPrepend,
parameterlessFunctionOfCodeToAppend
)
В приведенном ниже фрагменте вы можете видеть, как я использую функцию для расширения test.prototype.doIt ().
// allows you to prepend or append code to an existing function
function extender (container, funcName, prepend, append) {
(function() {
let proxied = container[funcName];
container[funcName] = function() {
if (prepend) prepend.apply( this );
let result = proxied.apply( this, arguments );
if (append) append.apply( this );
return result;
};
})();
}
// class we're going to want to test our extender on
class test {
constructor() {
this.x = 'instance val';
}
doIt (message) {
console.log(`logged: ${message}`);
return `returned: ${message}`;
}
}
// extends test.prototype.doIt()
// (you could also just extend the instance below if desired)
extender(
test.prototype,
'doIt',
function () { console.log(`prepended: ${this.x}`) },
function () { console.log(`appended: ${this.x}`) }
);
// See if the prepended and appended code runs
let tval = new test().doIt('log this');
console.log(tval);