我为类似的场景创建了一个小助手,因为我经常需要覆盖多个库中的函数。这个助手接受一个“命名空间”(函数容器)、函数名和覆盖函数。它将用新函数替换引用命名空间中的原始函数。
新函数接受原始函数作为第一个参数,原始函数参数作为其余参数。它将每次都保留上下文。它也支持 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
});
我没有创建任何性能测试。它可能会增加一些不必要的开销,这可能是也可能不是大问题,具体取决于场景。