종종 여러 라이브러리의 함수를 재정의해야했기 때문에 비슷한 시나리오를위한 작은 도우미를 만들었습니다. 이 도우미는 "네임 스페이스"(함수 컨테이너), 함수 이름 및 재정의 함수를 허용합니다. 참조 된 네임 스페이스의 원래 기능을 새로운 네임 스페이스로 대체합니다.
새 함수는 원래 함수를 첫 번째 인수로, 원래 함수 인수를 나머지로 허용합니다. 매번 컨텍스트를 유지합니다. 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
});
그래도 성능 테스트를 만들지 않았습니다. 시나리오에 따라 원치 않는 오버 헤드를 추가 할 수 있으며 크게 또는 그렇지 않을 수 있습니다.