Я створив маленького помічника для подібного сценарію, тому що мені часто потрібно було перекривати функції з декількох бібліотек. Цей помічник приймає "простір імен" (контейнер функцій), ім'я функції та функцію, що перекриває. Він замінить оригінальну функцію у згаданому просторі імен новою.
Нова функція приймає оригінальну функцію як перший аргумент, а оригінальну аргументацію функції як решту. Він буде зберігати контекст кожного разу. Він також підтримує недійсні та недійсні функції.
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
});
Я не створював жодних тестів на продуктивність. Можливо, це може додати небажані накладні витрати, що може чи не може бути великою справою, залежно від сценаріїв.