2011-12-13 2 views
3

현재 더 큰 개체를 만들고 있으며 디버깅/검사/값/결과 반환과 함께 더욱 빠르고 구체적인 작업이 필요합니다. 자바 스크립트 개체 메서드 이름을 얻는 방법?

지금 나는 다음과 같은 생각이 나를 단순히 하나의 함수 이름으로 객체 VAR debug를 정의 만이 부분을 로그인 할 수 있도록 할

var myObject = { 
    whatever: null, 
    whereever: null, 
    debug: false, 

    someFunction: function(arg) { 
     // General - would output *all* logs for all object functions. 
     // if (true === myObject.debug) 
     // console.log('FunctionNameHere', arg); 

     // More specific - would output *only* the log for the currently targeted function 
     if ('FunctionName' === myObject.debug) 
      console.log('FunctionNameHere', arg); 
    }, 
}; 

.

유일한 문제는 다음과 같습니다. FunctionName/someFunction은 어떻게 얻을 수 있습니까?

Sidenotes :

  • console.log(arguments.callee); 나에게 전체 기능 소스를 제공합니다.
  • console.log(arguments.callee.name);이 비어 있습니다. 나는 전체 개체의 로그에 대해 살펴 경우
  • console.log(arguments.callee.toString()); 반환
  • console.log(arguments.caller); 반환 undefined

을 비우, 나는 prototype.name="Empty" 등을 참조하십시오. 따라서 직접 객체 밖으로 가져올 기회가 없습니다.

감사합니다.

+0

그래서 일반적으로 말하자면 - 디버그가 'true'라면, myObject 함수가 실행될 때 함수 이름 + 인수를 가진 콘솔을 로깅하고 싶습니까? – kubetz

+0

@dzejkej 정확하지 않습니다. 함수 이름에'debug'를 설정하면 똑같은 이름의 fn의'log'만이 트리거됩니다. 이렇게하면 각 함수에 디버그를 빌드하고 필요할 때만 트리거 할 수 있습니다. – kaiser

+0

내 대답에는 하드 코딩없이 요구 사항에 맞는 코드가 포함되어 있습니다. 너무 진보적이지만 희망을 갖고이 흥미로운 언어를 연구하도록 동기를 부여합니다 : P. – kubetz

답변

3

debugtrue하고 debug이 함수의 이름으로 설정되어있는 경우, 당신은 당신의 모든 하나의 기능으로이 하드 코드하지 않아도 기능 만 로그인하면 당신은 모든 기능을 로그인하십시오.

기능을 동적으로 다시 작성하는 것입니다. 그것은 약간의 마법이지만, 훨씬 더 유연하며 더 많은 기능을 추가하거나 이름을 변경할 때 아무 것도 변경할 필요가 없습니다.

HERE은 작동 코드입니다.

for (var key in myObject) { 
    // if the keys belongs to object and it is a function 
    if (myObject.hasOwnProperty(key) && (typeof myObject[key] === 'function')) { 
    // overwrite this function 
    myObject[key] = (function() { 
     // save the previous function 
     var functionName = key, functionCode = myObject[functionName]; 
     // return new function that will write log message and run the saved function 
     return function() { 
     if (myObject.debug === true || myObject.debug === functionName) { 
      console.log('I am function ' + functionName, ' with arguments: ', arguments); 
     } 
     functionCode(arguments); 
     }; 
    })(); 
    } 
} 
+0

그 기능에 감사드립니다. 문제는 (내 생각 엔) 내 객체가 google.maps와 함께 작동한다는 것이므로 중간에 latlng이 깨지기 때문에 모든 것이 손상됩니다. – kaiser

+0

좋아, 객체 내부에서 작업 할 수있게되었습니다. 감사합니다 - 솔루션으로 표시됩니다. – kaiser

1

익명의 기능이므로 이름이 없으므로 지금 당장은 알 수없는 기능입니다.

당신은 이런 식으로 선언 한 경우 :

someFunction: function iNowHaveAName(arg) 

당신은에있는 브라우저에 따라 다른 방식으로 이름을 얻을 수있을 것입니다 브라우저에서

, 당신이 그것을 지원하는. arguments.callee.name을 사용할 수 있습니다. (이 빠른 성능 현명한 무료) 당신은 예외를 잡아 스택 트레이스에서 찾을 수없는 브라우저에서

:

try { 
i.dont.exist+=1; 
} 
catch(e) { 
//play with the stacktrace here 
} 

이 느리고 성능 현명한 것은 비용 -하지 않는다 생산 코드에서 :

+0

'arguments.callee'는 더 이상 사용되지 않으며 이후 버전의 JavaScript에서는 제거 될 것입니다. 이미 ES5 엄격 모드에서는 사용할 수 없습니다. – Phrogz

+0

저는 JS로 시작하기 때문에'someFunction : function iNowHaveAName'과 같이 이름을 붙일 수 있는지 몰랐습니다. Thanks +1 – kaiser

+1

또한 백 트레이스보다는 이름을 얻는 더 좋은 방법이 있습니다 :'function getName (f) {var match =/function (\ w +) /. exec (f + ""); 리턴 매치 && match [1]; }' – Phrogz

0

함수에 이름이 없으면 가져올 수 없습니다. — 인 정확히 익명 함수 —에는 이름이 없습니다. 함수 값을 참조하기 위해 하나 이상의 변수 또는 객체 속성을 할당해도 이름이 지정되지 않습니다.

var a = [function(){}]; 
var b = a; 
var c = a[0]; 

이 단일 기능의 "이름이"무엇인가

다음 예를 고려해

? a[0]? b[0]? c? 왜 다른 사람을 선택해야합니까?

JavaScript는 특정 객체 (함수 포함)에 대한 모든 참조를 요청할 수있는 메소드가 없습니다.

관련 문제