2012-05-25 2 views
0

색상, 이름 등 다양한 속성을 사용하여 각기 다른 레벨 (디버그, 정보, 경고 등)의 사용자 정의 로거를 프로토 타입 화하려고합니다.루프 내에서 일련의 동적 함수를 프로토 타입 할 수 있습니까?

내가하려는 것은 동적으로 모두 빌드하는 것입니다. 그 레벨을 모든 속성을 저장하는 해시 맵에서 가져옵니다. 예를 들어 logger.debug('test'), logger.info('text) 등과 같은 사용자 지정 로거 개체가 있습니다. 당신은 아이디어를 얻습니다.

하지만,이 특정 코드에 문제가있어 : 항상 마지막 로거 (ERROR)을 가리로

var MyLogger = function(opts) { 
    this.level = opts.level || 0 
    this.loggers = {} 

    var self = this 

    for (l in LEVELS) { 
     this.addLogger(l, new loggerOutput(LEVELS[l])) 
     this[l] = function(message) { 
      self.getLogger(l).output(message) 
     } 
    } 
} 

문제는 self.getLogger (L) 함께. 내가 정적 문자열 변수를 교체하는 경우, 작동 : self.getLogger ('정보')

해결 방법은 손으로 모든 로거 프로토 타입이며, obviosly이 작동하지만, 나는 더 나은을 찾기 위해 기다리고 있었다 솔루션 :

MyLogger.prototype = { 
    debug: function(message) { 
     this.getLogger('debug').output(message) 
    }, 
    info: function(message) { 
     this.getLogger('info').output(message) 
    } 
     ... 
} 

감사합니다.

+1

당신은 루프의 폐쇄를 가지고 : http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – ajm

답변

1

프로토 타입 솔루션을 사용하지만 현재 "수준"을 함수 팩터 리로 전달하여 함수를 루프에 할당하십시오.

for (var L in LEVELS) 
    MyLogger.prototype[L] = loggerMaker(L) 

function loggerMaker(l) { 
    return function(message) { 
     this.getLogger(l).output(message) 
    }; 
} 

여기서 I는 전류 루프를 참조 L 새로운 변수 영역을 생성하는 기능을 사용했다.

최신 자바 스크립트 환경에서만 코딩하는 경우 객체 대신 배열을 사용하여 레벨을 보유한 다음 forEach을 익명 함수와 함께 사용하십시오.

;['debug','info','warn'].forEach(function(L) { 
    MyLogger.prototype[L] = function(message) { 
     this.getLogger(L).output(message); 
    }; 
}); 
관련 문제