2012-05-27 4 views
4

JavaScript로 "폴백 (fallback)"메소드를 정의 할 수 있습니까? 예를JavaScript에서 "대체"메소드를 정의 할 수 있습니까?

function MyObject() { 
    /* what do i have to add here to have my defaultMethod? */ 
} 

var obj = new MyObject(); 
obj.doesntExistInMyObject(); // I want defaultMethod to be called 
obj.doesntExistEither(); // I want defaultMethod to be called, too 

를 들어

즉 : 내가 defaultMethod은 내가 obj.calledMethod();obj.calledMethod == undefined 쓰기 할 때마다 호출 될,하지만 호출 코드에 undefined를 확인하지 않으려합니다.

답변

4

JavaScript는 현재이 기능을 가지고 있지 않습니다. 그래도 다음 버전에서는 proxies을 통해 가능할 수 있습니다. 그래서 그때까지이 작업을 수행 할 같은 매우 추한 뭔가해야 할 것 :

MyObject.prototype.ex = function(fname) { 
    var f = this[fname], 
     args = Array.prototype.slice.call(arguments, 1); 
    if (typeof f === "function") { 
     return f.apply(this, args); 
    } 
    return this.defaultMethod.apply(this, args); 
}; 

을 ...이처럼 사용

"실행"에 대한
var obj = new MyObject(); 
obj.ex("doesntExistInMyObject", "arg", "arg"); 

(ex 이후 callFunction#call과 너무 쉽게 혼동됩니다.)

+0

답변 해 주셔서 감사합니다. 그다지 편리하지는 않지만 아마 그런 해결책을 찾아야 할 것입니다. 자바 스크립트에서 예외가 발생하는지 여부를 아는 사람이 있습니까? – JohnB

+1

@ 존 : 그 질문에는 두 가지 측면이 있습니다 :'try' 블록의 비용과 실제로 예외를 던지는 비용. 예외 개념을 가진 현대 언어 환경은''try' 블록을 매우 저렴하게 만듭니다. 예를 들어 자바 VM의 초판은 상당히 비싼'try' 블록을 가지고 있지만 중요한 문제로 확인되었고 상당히 빨리 수정되었습니다.)'try' 블록이 * normal code의 일부가되어야하기 때문입니다 흐름*. 반면에 예외는 예외입니다. 예외. 정상적인 프로그램 흐름에서는 사용해서는 안됩니다. (모두가 동의하는 것은 아닙니다.) * (계속) * –

+1

@ JohnB : * (계속) * 예외를 던지면 비용이 많이 드는 경향이 있습니다. 비용이 많이 드는 데는 상황에 따라 다르지만 JavaScript가 중요하므로 * 엔진 *에 민감합니다. 그래서 그것을위한 것이 아니라 당신의 목표 엔진을 측정하는 것입니다. [try 블록의 비용] (http://jsperf.com/cost-of-try-blocks) 및 [예외 발생 비용]에 대한 테스트를 함께 수행합니다 (http://jsperf.com/cost- 던지기 예외). 'try' 블록의 비용이 너무 작아서 jsPerf의 오차 범위에 해당하는 것처럼 보입니다. 현대 엔진 전반에 걸쳐 비용을 실질적으로 제로화합니다. * (계속) * –

관련 문제