我已經創建了一個類似的場景一個小幫手,因爲我經常需要從幾個圖書館覆蓋功能。這個助手接受一個「命名空間」(函數容器),函數名和覆蓋函數。它將用新的名稱空間替換引用的名稱空間中的原始函數。
新函數接受原始函數作爲第一個參數,並將原始函數參數作爲其餘參數。它每次都會保留上下文。它也支持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