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