2011-08-07 5 views
12

JavaScript 객체의 인스턴스를 가져 오는 안정적인 방법이 있습니까?javascript 유형/인스턴스 이름 얻기

예를 들어 위조 'obj.getInstance()'기능에 의존합니다.

ECMA 사양의 일부가 아닌 경우 브라우저/node.js 지원 및 호환성을 답변에 포함하십시오.

+1

난 당신이 질문을 바꿔해야한다 생각합니다. 'x' *는 인스턴스이고 yes는 new를 사용하면 인스턴스를 얻는 데 꽤 안정적입니다. 어쩌면 인스턴스의 유형을 얻기 위해'instancof'를 찾고 있을까요? https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/instanceof –

답변

19

는 인스턴스화하는 함수에 대한 포인터 얻기 (안 "클래스"하지만 유형이다), obj 어떤 객체이다 obj.constructor를 사용합니다.


JavaScript에는 클래스가 없습니다. 따라서 JavaScript에는 클래스 인스턴스가 없습니다. 개체 만 있습니다. 객체는 다른 객체 (프로토 타입이라고도 함)에서 상속받습니다. 당신의 코드에서 당신이하고있는 것은 말 그대로 문자 T를 정의하는 것입니다. 속성 Q는 또 다른 객체이고, 속성 W는 또 다른 객체입니다. 속성 C는 함수입니다.

"T.Q.W.C의 새 인스턴스 만들기"에서는 실제로 T.Q.W.C라는 함수를 생성자로만 호출합니다. 생성자로 호출되는 함수는 생성자 함수가 호출 된 새 객체를 반환합니다 (constructorFunction.apply(newObject, arguments);과 같이 this이 새 객체 임). 반환 된 객체는 객체를 만들기 위해 constrcutor로 호출 된 함수를 가리키는 숨겨진 속성 constructor을가집니다. 또한 주어진 함수가 instanceof 연산자를 사용하여 객체의 생성자 함수로 사용되었는지 테스트 할 수있는 언어 기능이 있습니다.

그래서 다음 작업을 수행 할 수 있습니다 :

console.log(x instanceof T.Q.W.C); 

또는

console.log(x.constructor === T.Q.W.C); 
+1

수정 사항에 신경 쓰지 않기를 바랍니다. –

+0

다음 질문에 대한 대답입니다. – ekerner

4

나는이 몇 가지 문제가 있었다, 해결책이었다 : 만 크롬에서 테스트

String(x.constructor) === String(T.Q.W.C) 
4

은 여전히 ​​2017 년이 읽고 : 그것은 불변의 특성 아니므로

obj.constructor 사용에 대한주의하십시오.

instanceof 연산자는 일반적으로 더 안정적입니다. 또한 Object.getPrototypeOf(obj)를 사용할 수 있습니다

var arr = []; 
arr instanceof Array; // true 
Object.getPrototypeOf(arr); // Array [ ] 
Object.getPrototypeOf(arr) === Array.prototype; // true 

이 주제에이 유용한 문서를 참조하십시오 :

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md