로그인

이메일
비밀번호
왼쪽에 걸리적 거리는 거 숨기기

'오버로딩'에 해당되는 글 1건

  1. 자바스크립트 함수의 함수 오버로딩 (6)

    2008/04/08


아래 올린 타입검사 코드를 사용하여 오버로딩을 구현했다.
같은 함수명으로 여러가지 서로 다른 타입의 인자를 받아들이는 함수를 등록하면 호출 시 가장 적당한 함수를 찾아서 실행해주는 식이다.

(Language : javascript)
  1. /**
  2. * 함수 오버로딩
  3. *
  4. * @author hooriza
  5. */
  6. Function.prototype.overload = function(fpAddFunc) {
  7.  
  8.   var fpRet = this;
  9.  
  10.   // 이미 오버로드 된 함수인지
  11.   var bOverloaded = this._overloaded ? true : false;
  12.  
  13.   // 오버로드 안 되어 있으면
  14.   if (!bOverloaded) {
  15.  
  16.     fpRet = function() {
  17.  
  18.       var aLists = arguments.callee._overloaded;
  19.       var fpRaw = null;
  20.  
  21.       // 인자갯수까지 완벽히 일치하는걸로 실행
  22.       for (var i = 0, fpMethod; fpMethod = aLists[i]; i++) {
  23.  
  24.         if (fpMethod.typesMatch) {
  25.  
  26.           if (fpMethod.typesMatch(arguments, true))
  27.             return fpMethod.apply(this, arguments);
  28.  
  29.         } else if (!fpRaw) {
  30.  
  31.           fpRaw = fpMethod;
  32.  
  33.         }
  34.  
  35.       }
  36.  
  37.       // 대충 맞는 거라도 실행
  38.       for (var i = 0, fpMethod; fpMethod = aLists[i]; i++) {
  39.  
  40.         if (fpMethod.typesMatch && fpMethod.typesMatch(arguments, false))
  41.           return fpMethod.apply(this, arguments);
  42.  
  43.       }
  44.  
  45.       // 아예 types 안 정해진 함수 실행
  46.       if (fpRaw) return fpRaw.apply(this, arguments);
  47.  
  48.       // 실행 할 메쏘드 없음 예외 발생
  49.       throw new Error('Not found the matched method');
  50.      
  51.     };
  52.  
  53.     fpRet._overloaded = [ this ];
  54.  
  55.   }
  56.  
  57.   fpRet._overloaded.push(fpAddFunc);
  58.  
  59.   return fpRet;
  60.  
  61. };

사용은 아래처럼 한다.

(Language : javascript)
  1. var foo = function(nNumber) {
  2.   alert('숫자!');
  3. }.types(Number);
  4.  
  5. foo = foo.overload(function(sStr) {
  6.   alert('문자열!');
  7. }.types(String));
  8.  
  9. foo = foo.overload(function(nNumber, aArray) {
  10.   alert('숫자랑 배열!');
  11. }.types(Number, Array));
  12.  
  13. foo = foo.overload(function(oAnything) {
  14.   alert('아무거나');
  15. });
  16.  
  17. foo(10); // 결과 : 숫자!
  18. foo('hello'); // 결과 : 문자!
  19. foo(10, []); // 결과 : 숫자랑 배열!
  20. foo({}); // 결과 : 아무거나

이를 사용하면 클래스를 구현할때 메쏘드 오버로딩이 가능하도록 개발할 수 있다.
영양가 있는 포스팅인가요
(총 1분이 투표해서 0.0점) 0.0점
2008/04/08 16:20 2008/04/08 16:20