재정 자바 스크립트 기능을 하는 동안 참조하여 원
-
08-07-2019 - |
문제
가능 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();
}
};