a()
재정의하려는 함수가 있지만 a()
컨텍스트에 따라 순서대로 원본 을 수행 해야합니다 . 예를 들어, 때때로 페이지를 생성 할 때 다음과 같이 재정의하고 싶습니다.
function a() {
new_code();
original_a();
}
때로는 이렇게 :
function a() {
original_a();
other_new_code();
}
original_a()
오버 라이딩 내에서 어떻게 얻을 수 a()
있습니까? 가능합니까?
이런 식으로 오버 라이딩에 대한 대안을 제안하지 마십시오. 나는이 방법에 대해 구체적으로 묻고 있습니다.
답변
다음과 같이 할 수 있습니다.
var a = (function() {
var original_a = a;
if (condition) {
return function() {
new_code();
original_a();
}
} else {
return function() {
original_a();
other_new_code();
}
}
})();
original_a
익명 함수 내부에 선언 하면 전역 네임 스페이스가 복잡해지지 않지만 내부 함수에서 사용할 수 있습니다.
의견에 언급 된 Nerdmaster와 마찬가지로 끝에를 포함해야합니다 ()
. 당신은 외부 함수를 호출하고 저장할 결과를 (두 개의 내부 기능 중 하나)에 a
,에 외부 함수 자체를 저장하지 a
.
답변
프록시 패턴은 당신을 도울 수 있습니다
(function() {
// log all calls to setArray
var proxied = jQuery.fn.setArray;
jQuery.fn.setArray = function() {
console.log( this, arguments );
return proxied.apply( this, arguments );
};
})();
위의 코드는 “프록시”변수를 숨기는 함수로 코드를 래핑합니다. jQuery의 setArray-method를 클로저에 저장하고 덮어 씁니다. 그런 다음 프록시는 모든 호출을 메소드에 기록하고 호출을 원본에 위임합니다. apply (this, arguments)를 사용하면 호출자가 원래 메소드와 프록시 된 메소드의 차이점을 알 수 없습니다.
답변
고마워 프록시 패턴이 실제로 도움이되었습니다 …. … 실제로 전역 함수 foo를 호출하고 싶었습니다 .. 특정 페이지에서 몇 가지 확인을해야합니다. 그래서 나는 다음을 수행했다.
//Saving the original func
var org_foo = window.foo;
//Assigning proxy fucnc
window.foo = function(args){
//Performing checks
if(checkCondition(args)){
//Calling original funcs
org_foo(args);
}
};
Thnx 이것은 정말 나를 도와
답변
다음과 같은 구문을 사용하여 함수를 재정의 할 수 있습니다.
function override(f, g) {
return function() {
return g(f);
};
}
예를 들면 다음과 같습니다.
a = override(a, function(original_a) {
if (condition) { new_code(); original_a(); }
else { original_a(); other_new_code(); }
});
편집 : 오타가 수정되었습니다.
답변
임의의 인수 전달 :
a = override(a, function(original_a) {
if (condition) { new_code(); original_a.apply(this, arguments) ; }
else { original_a.apply(this, arguments); other_new_code(); }
});
답변
@Matthew Crumley가 제공하는 대답은 즉시 호출 된 함수 표현식을 사용하여 이전 ‘a’함수를 반환 된 함수의 실행 컨텍스트로 닫는 것입니다. 나는 이것이 최선의 대답이라고 생각하지만 개인적으로는 IIFE에 인수로 함수 ‘a’를 전달하는 것을 선호합니다. 더 이해하기 쉽다고 생각합니다.
var a = (function(original_a) {
if (condition) {
return function() {
new_code();
original_a();
}
} else {
return function() {
original_a();
other_new_code();
}
}
})(a);
답변
위의 예제 는 함수 재정의에 올바르게 적용 this
되거나 arguments
올바르게 전달 되지 않습니다 . 밑줄 _.wrap ()은 기존 함수를 래핑 this
하고 arguments
올바르게 적용 하고 전달 합니다. 참조 : http://underscorejs.org/#wrap