Я создал небольшой помощник для аналогичного сценария, потому что мне часто приходилось переопределять функции из нескольких библиотек. Этот помощник принимает «пространство имен» (контейнер функции), имя функции и переопределяющую функцию. Он заменит исходную функцию в указанном пространстве имен новой.
Новая функция принимает исходную функцию в качестве первого аргумента, а исходные функции - в качестве остальных. Это сохранит контекст каждый раз. Он также поддерживает функции void и non void.
function overrideFunction(namespace, baseFuncName, func) {
var originalFn = namespace[baseFuncName];
namespace[baseFuncName] = function () {
return func.apply(this, [originalFn.bind(this)].concat(Array.prototype.slice.call(arguments, 0)));
};
}
Использование, например, с Bootstrap:
overrideFunction($.fn.popover.Constructor.prototype, 'leave', function(baseFn, obj) {
// ... do stuff before base call
baseFn(obj);
// ... do stuff after base call
});
Я не создавал никаких тестов производительности, хотя. Это может добавить некоторые нежелательные накладные расходы, которые могут или не могут иметь большое значение, в зависимости от сценариев.