我已经创建了一个类似的场景一个小帮手,因为我经常需要从几个图书馆覆盖功能。这个助手接受一个“命名空间”(函数容器),函数名和覆盖函数。它将用新的名称空间替换引用的名称空间中的原始函数。
新函数接受原始函数作为第一个参数,并将原始函数参数作为其余参数。它每次都会保留上下文。它也支持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)));
};
}
使用例如与引导:
overrideFunction($.fn.popover.Constructor.prototype, 'leave', function(baseFn, obj) {
// ... do stuff before base call
baseFn(obj);
// ... do stuff after base call
});
我没有,虽然产生任何性能测试。根据情况,它可能会添加一些不必要的开销,这些开销可以或不可以是一个大问题。
谢谢!这非常有帮助。 – Kev 2008-11-17 20:06:21
哇。超酷 – naveen 2011-03-04 03:54:14
对于像我这样的任何白痴 - 密切注意最后的“()” - 没有这个,它会返回外部函数,而不是内部函数:) – Nerdmaster 2012-07-24 18:27:30