Benzer bir senaryo için küçük bir yardımcı oluşturdum çünkü sık sık birkaç kütüphaneden fonksiyonları geçersiz kılmam gerekiyordu. Bu yardımcı bir "ad alanı" (işlev kabı), işlev adı ve geçersiz kılma işlevini kabul eder. Belirtilen ad alanındaki orijinal işlevi yenisiyle değiştirir.
Yeni işlev, orijinal işlevi ilk argüman olarak kabul eder ve orijinal işlev argümanları geri kalanı olarak kabul eder. Bağlamı her zaman koruyacaktır. Geçersiz ve geçersiz işlevleri de destekler.
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)));
};
}
Örneğin Bootstrap ile kullanım:
overrideFunction($.fn.popover.Constructor.prototype, 'leave', function(baseFn, obj) {
// ... do stuff before base call
baseFn(obj);
// ... do stuff after base call
});
Yine de hiçbir performans testi oluşturmadım. Muhtemelen senaryolara bağlı olarak önemli olabilecek veya olmayabilecek bazı istenmeyen ek yükler ekleyebilir.