2011-03-16 3 views
4

은의 다음 예제 코드를 보자 : 자바 스크립트 클래스의 이름을 얻을하는 방법

var ns = {}; // Some namespace 

ns.Test = function() 
{ 
    // Constructor of class Test 
}; 

var inst = new ns.Test(); 
var className = hereIsTheMagic(inst); // Must return "ns.Test" 

그래서 내가 네임 스페이스에 '테스트' 'NS'와 '이달'라는 이름의이 클래스의 인스턴스라는 클래스를 만듭니다. 이제 클래스 이름을 찾고 싶습니다. 어떻게해야합니까?

지금까지 클래스 이름을 사용하여 각 클래스에 문자열 속성을 부여하여이 문제를 해결했습니다. 따라서 inst.constructor.className을 사용하여 클래스 이름에 액세스 할 수있었습니다. 하지만 가능하다면 클래스를 복사/붙여 넣을 때 오류가 발생하기 쉽기 때문에이 작업을 중단하고 싶습니다.

모든 현재 브라우저에서 작동하는 솔루션이없는 경우 클래스 이름에 대한 액세스를 제공하는 향후 ECMAScript 사양에 적어도 일부 새로운 기능이있을 수 있습니까?

+0

이것이 가능한지 확실하지 않지만 내 질문은 왜 이것을하려고합니까? 대부분 OOP를 망칠 것입니다. – Frizi

+0

@Frizi : 저는 kayahr을 말할 수 없지만 오류보고에 유용 할 수 있습니다. –

+0

@Frizi : 객체 직렬화/비 직렬화에 주로 필요합니다. 방금 사파리가 프로파일 러에서 익명 함수의 이름을 지정하는 데 사용되는 특별한'displayName' 속성을 지원한다는 것을 알았습니다. 아마 이것도 사용하는 것이 좋습니다. 그래서 먼저'name'을 검사하고 이것이 없으면 모든 클래스에 대해 수동으로 설정해야하는'displayName'을 확인하십시오. – kayahr

답변

8

JavaScript에는 클래스가 없으며 생성자 함수과 프로토 타입 체인이 있습니다. 함께 수업을하는 것처럼 보이지만 실제로는 그렇지 않습니다. :-)

아니오, hereIsTheMagic이 우선조차 인 ECMAScript 5에서, 당신의 예에서 문자열 "ns.Test"를 찾을 수있는 표준 방법은 없습니다, ns.Test는 (그 함수를 참조하여 전용 속성하지 않을 수 있습니다 예를 들어 ns.OtherTest = ns.Test;을 추가하면 어떻게 될까요?)

자바 스크립트 적절한 이름을 가진 기능의 개념을 가지고 있지만, 함수의 적절한 이름에 액세스하는 표준 방법이 없습니다, 심지어 당신이 할 수 있다면, 당신은 ns.Test를 호출하고있는 기능은 익명입니다. ns에 할당 한 속성의 이름은 (Test)이지만 함수는 아닙니다. , 그것 때문에 helps tools help you

var ns = {}; // Some namespace 
(function() { 
    ns.Test = ns_Test; 

    function ns_Test() { 
    // Constructor of class Test 
    } 
})(); 

... 좋은 생각이지만, 그 이름에서 얻을 수있는 자바 스크립트 코드 자체에 대한 표준 방법은 없습니다 :

당신은 함수의 이름을 줄 수 있습니다. (. 그것은 작동해야하지만, ns.Test = function ns_Test() { ... };을하지만 관련된 다양한 버그가 인 ECMAScript의 다양한 구현이 존재하지 마십시오에 대해 자세히 the article linked above에..)


업데이트을 : 아마해야 말했다 : 표준 기능 (위의 예제에서 ns_Test)의 적절한 이름을 얻는 표준 방법이 있습니다.

이 가장 쉬운

포함 많은 구현, 지원하는 기능 인스턴스에 name 숙박 시설입니다 :

  • 파이어 폭스의 SpiderMonkey를
  • 크롬의 V8
  • 오페라의 엔진 (그렇게하지 그것의 이름을 아십시오)
  • 사파리의 엔진 (사파리 모바일 포함)

... alert(ns_Test.name);은 "ns_Test"를 경고합니다.그러나 -standard이며 JScript (Microsoft의 엔진)의 모든 버전에서 지원되지 않으며 IE9에서 사용되는 버전조차도 출시되지 않았습니다. 빠른 테스터 페이지는 다음과 같습니다. http://jsbin.com/oxuva3

다시 말해서 함수의 적절한 이름입니다 (위의 예제 참조). 할당 한 속성의 이름이 아닙니다. name 만약

(또는하지 않을 수 있습니다) 예를 들어, "기능 ns_Test() {...}"함수의 문자열 표현을 (반환 할 수 있습니다 함수 객체에 toString()을 사용할 수 있습니다,이 없다). 이는 완전히 비표준이지만 데스크톱 브라우저에서는 일반적입니다. 그것은 여러 모바일 브라우저에서 작동하지 않으며, 어쨌든 나쁜 생각 일 수 있습니다. :-)

+1

큰 설명, TJ :) 또한 throw합니다. (이 함수의 이름 속성을 포함하여) 비표준 ES 확장의 일부를 나열한 [이 호환성 테이블] (http://kangax.github.com/es5-compat-table/non-standard/)에 나와 있습니다. – kangax

+0

@kangax : 건배! –

+0

함수 표현식에 이름을 추가 할 수도 있습니다 :'ns.Test = function ns_Test() {...};'. 그 이름은'ns.Test.name'을 통해서도 가능합니다. –

관련 문제