複数のライブラリの関数をオーバーライドする必要があることが多かったため、同様のシナリオで小さなヘルパーを作成しました。このヘルパーは、「名前空間」(関数コンテナー)、関数名、およびオーバーライドする関数を受け入れます。参照されている名前空間の元の関数を新しい関数に置き換えます。
新しい関数は、元の関数を最初の引数として受け入れ、元の関数の引数を残りの引数として受け入れます。常にコンテキストを保持します。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
});
ただし、パフォーマンステストは作成しませんでした。シナリオによっては、大したことのない不要なオーバーヘッドが追加される可能性があります。