문제

가능 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(); }
});

위의 예는 올바르게 적용되지 않습니다 this 또는 패스 arguments 함수 재정의에 올바르게. 밑줄 _.wrap ()가 기존 함수를 랩하고 적용합니다 this 그리고 패스 arguments 바르게. 보다: http://underscorejs.org/#wrap

@Matthew Crumley가 제공하는 답은 즉시 호출 된 기능 표현을 사용하여 구형 'A'기능을 반환 된 기능의 실행 컨텍스트로 닫는 것입니다. 나는 이것이 최선의 대답이라고 생각하지만 개인적으로는이 기능을 iife에게 논쟁으로 전달하는 것을 선호합니다. 더 이해할 수 있다고 생각합니다.

   var a = (function(original_a) {
        if (condition) {
            return function() {
                new_code();
                original_a();
            }
        } else {
            return function() {
                original_a();
                other_new_code();
            }
        }
    })(a);

다른 사람이 코드를 작성했으며 코드에서 찾을 수없는 함수에 줄을 추가하고 싶었습니다. 따라서 해결 방법으로 나는 그것을 무시하고 싶었습니다.

솔루션 중 어느 것도 나에게 효과가 없었습니다.

내 경우에 효과가있는 것은 다음과 같습니다.

if (typeof originalFunction === "undefined") {
    originalFunction = targetFunction;
    targetFunction = function(x, y) {
        //Your code
        originalFunction(a, b);
        //Your Code
    };  
}

여러 라이브러리에서 기능을 무시해야하기 때문에 비슷한 시나리오를 위해 작은 도우미를 만들었습니다. 이 헬퍼는 "네임 스페이스"(함수 컨테이너), 함수 이름 및 재정의 함수를 허용합니다. 참조 된 네임 스페이스의 원래 기능을 새 기능으로 대체합니다.

새 함수는 원래 기능을 첫 번째 인수로 받아들이고 원래 함수는 나머지 인수로 인수합니다. 매번 상황을 보존 할 것입니다. 그것은 빈 공간 및 비 공동 기능도 지원합니다.

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
});

그래도 성능 테스트를 만들지 않았습니다. 시나리오에 따라 원치 않는 오버 헤드를 추가 할 수 있습니다.

내 생각에 이상이 답변을 읽을 수 없/유지 보수,그리고 다른 답변되지 않을 제대로 묶는다.여기에 읽을 수 있는 솔루션을 사용하여 ES6 구문을 모두 해결이 이러한 문제입니다.

const orginial = someObject.foo;
someObject.foo = function() {
  if (condition) orginial.bind(this)(...arguments);
};

그래서 내 대답은 결국 원래 객체를 가리키는 _this 변수를 사용할 수있는 솔루션이되었습니다. "정사각형"의 새 인스턴스를 만들지 만 "정사각형"이 크기를 생성 한 방식을 싫어했습니다. 내 특정 요구를 따라야한다고 생각했습니다. 그러나 그렇게하기 위해서는 정사각형이 제곱에 이미 존재하는 다른 함수를 호출하는 해당 기능의 내부를 업데이트 된 "getsize"기능을 갖도록해야합니다. this.getVolume (). 그러나 그렇게하기 위해서는 미친 해킹 없이이 작업을 수행해야했습니다. 그래서 여기 내 해결책이 있습니다.

다른 객체 이니셜 라이저 또는 도우미 기능.

this.viewer = new Autodesk.Viewing.Private.GuiViewer3D(
  this.viewerContainer)
var viewer = this.viewer;
viewer.updateToolbarButtons =  this.updateToolbarButtons(viewer);

다른 객체에서 기능합니다.

updateToolbarButtons = function(viewer) {
  var _viewer = viewer;
  return function(width, height){ 
blah blah black sheep I can refer to this.anything();
}
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top