2010-08-04 5 views
2

화면에 메시지를 기록하는 로거 개체를 쓰려고합니다. 여기 내 코드가있다. http://github.com/huseyinyilmaz/javascript-logger 뭔가를 로깅해야하는 모든 함수에서, 나는 내 함수의 시작과 끝에서 loggerstart와 loggerEnd 함수를 작성하고있다. 하지만 모든 기능에 대해 thos 코드 자동 실행을 실행하고 싶습니다. 함수 프로토 타입을 수정하여 모든 함수 호출을 자동으로 실행할 수있는 방법이 있습니까? (자바 스크립트 프레임 워크를 사용하지 않습니다.)javascript 함수 수정

+0

스택에서 호출자 메서드 이름을 얻을 수 있습니다 (성능이 너무 크지 않은 경우) ... http : //eriwen.com/javascript/js-stack-trace/ – sje397

+0

enableLog 스위치를 내 물건이 필요할 때만 움직일거야. 성능이 문제가되지 않는 이유가 여기 있습니다. Function.prototype에 로깅 코드를 추가 할 수 있다면 매우 유용 할 것입니다. 내 개체의 모든 메서드를 통해 물결에 가서 그들을 수정하면 나는 이미 내 함수 이름을 알게 될 것이다. – yilmazhuseyin

답변

4

EDIT: Rewritten the function to make it more modular

음으로 호출이 그것을 할 수있는 소름 방법,하지만 일부 기능을 대체해야 할 때 가끔이 방법을 사용합니다. 그것은 잘 작동하고 모든 종류의 사용자 정의가 가능하며 이해하기 쉽습니다 (여전히 소름 끼치는).

그러나 모든 종류의 전역 개체에 모든 기능을 저장해야합니다. 자세한 내용은 예제를 참조하십시오.

function dynamic_call_params(func, fp) { 
    return func(fp[0],fp[1],fp[2],fp[3],fp[4],fp[5],fp[6],fp[7],fp[8],fp[9],fp[10],fp[11],fp[12],fp[13],fp[14],fp[15],fp[16],fp[17],fp[18],fp[19]); 
} 

function attachWrapperToFunc(object, funcName, wrapperFunction) { 
    object["_original_function_"+funcName] = object[funcName]; 
    object[funcName] = function() { 
     return wrapperFunction(object, object["_original_function_"+funcName], funcName, arguments); 
    } 
} 

function attachWrapperToObject(object, wrapperFunction) { 
    for (varname in object) { 
     if (typeof(object[varname]) == "function") { 
      attachWrapperToFunc(object, varname, wrapperFunction); 
     } 
    } 
} 

그리고 일부 사용 예 :

var myProgram = new Object(); 
myProgram.function_one = function(a,b,c,d) { 
    alert(a+b+c+d); 
} 
myProgram.function_two = function(a,b) { 
    alert(a*b); 
} 

myProgram.function_three = function(a) { 
    alert(a); 
} 

function loggerWrapperFunction(functionObject, origFunction, origFunctionName, origParams) { 
    alert("start: "+origFunctionName); 
    var result = dynamic_call_params(origFunction, origParams); 
    alert("end: "+origFunctionName); 
    return result; 
} 

attachWrapperToObject(myProgram,loggerWrapperFunction); 
myProgram.function_one(1,2,3,4); 
myProgram.function_two(2,3); 
myProgram.function_three(5); 

출력 될 것입니다 : start,10,end,start,6,end,start,5,end

그래서 일반적으로는 사용자 정의 작성 래퍼 기능을 자동으로 일부 개체의 각 기능을 포장 할 수 있습니다.

+0

방법. 물결 모양의 창 객체로 가서 전역 메서드를 추가 할 수도 있습니다. 그러나 다른 기능을 종료하는 기능은 남아있게됩니다 (수동으로 로거에 추가 할 수 있음). 이것이 최선의 방법이라고 생각합니다. 답변 주셔서 감사합니다. – yilmazhuseyin

+0

윈도우 객체를 통한 루핑이 실패합니다. 문제는 반복 가능하지만 읽을 수없는 일부 윈도우 속성이 있다는 것입니다.예를 들어 다음과 같이 해보자 :'alert (typeof (window [ "sessionStorage"]));'. 그래도 읽을 수없는 속성을 건너 뛰려면 일부 불쾌한 예외 처리로 처리 할 수 ​​있습니다. 그런데 래퍼 함수 매개 변수에 매개 변수 (예 : 함수 이름)를 추가 할 수도 있습니다. 하기는 어렵지 않지만 로거에게 어떤 기능이 호출되고 어떤 매개 변수를 사용하는지에 대한 정보를 제공합니다. – bezmax

+0

'추가 매개 변수'변경 사항을 반영하도록 코드를 변경했습니다. – bezmax

0

래퍼 함수로 모든 함수를 호출 할 수 있습니다.

function wrapper(callback) { 
    loggerstart(); 
    callback(); 
    loggerend(); 
} 

그리고 wrapper(yourfunction);

+0

이제 그는 전체 프로젝트에서 자신의 기능을 래퍼 (wrapper)를 사용하여 10 억 가지의 서로 다른 기능을 보완 할 필요가있을 것입니다. –

+0

예, 그는 그렇게합니다. 그렇지 않으면 내가 아는 해결책이 없습니다. 당신이 그것을 가지고 있다면, 게시하지만, 내 접근 방식을 비판하지 않습니다. 어쨌든 ... 당신은 easly 검색하고 그 기능을 많이 가지고 있다고 생각하지 않는 그 기능을 수백만 (10 억 교체 할 수 있습니다. – alopix

+0

이 로거는 코드에서 가능한 최소한의 설치 공간을 필요로하므로 최소한의 efford로 프로젝트에 통합 될 수 있습니다. 귀하의 제안은 분명히 효과가 있지만 그 발자취는 커질 것입니다. – yilmazhuseyin