[javascript] 원본을 참조하면서 JavaScript 함수 재정의

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