(13) 객체의 타입 판정하기
ES2015 이전의 자바스크립트는 '클래스'라는 개념이 없다. 따라서 해당 객체안에 어떤 프로퍼티가 있는지, 생성자가 무엇인지 판정하기가 애매하다. 이번 포스팅에서는 이를 보충해줄 수 있는 명령어 4가지에 관해서 알아보자.
1 『프로토타입의 바탕이 되는 '생성자' 취득하기』
var Animal = function( ){ };
var Dog = function( ){ };
Dog.prototype = new Animal( );
var a = new Animal( );
var d = new Dog( );
console.log(a.constructor === Animal ); // 결과: true
console.log(d.constructor === Animal ); // 결과: true
console.log(d.constructor === Dog ); // 결과: false
위의 코드에서 Dog는 Animal이란 프로토타입을 계승하고 있다. constructor(생성자)는 원본 프로토타입인지 유무를 판단하는 명령어이다. Dog를 상속받은 'd'를 검사해보면, Animal에 대해서는 true가 나오지만, Dog에 대해서는 false가 나온다. 즉, constructor 명령어로 원본 프로토타입이 무엇인지 알 수 있다.
2 『instanceof 연산자』
위의 예제 그대로 다음 명령어를 실행한다.
console.log( d instanceof Animal ); // 결과 true
console.log( d instanceof Dog ); // 결과 true
console.log( Dog instanceof Animal ); //결과 false
instanceof 연산자는 원본 프로토타입에 상관없이 '인스턴스 여부'만 판정한다. 위의 코드에서 'd'는 Animal과 Dog의 인스턴스다. 하지만 Dog는 Animal을 계승한 또다른 생성자이므로 instance 유무는 false가 된다.
3 『 isPrototypeOf 메소드』
instanceof와 반대방향으로 검증한다고 생각하면
된다. 상위 프로토타입 객체에서 상속받은 instance가 맞는지 아닌지를 검사한다.
console.log(Dog.prototype.isPrototypeOf(d)); // 결과: true
console.log(Dog.prototype.isPrototypeOf(a)); // 결과: false
a는 Animal 프로토타입 객체를 상속받은 인스턴스 객체이므로 false가 된다.
4 『 in 연산자』
자바스크립트에서 주의해야 할 점은 각 인스턴스마다 보존 메모리가 생겨난다는 점이다.
같은 프로토타입 모델을 상속받더라도 각 인스턴스별로 프로퍼티 내용이 달라질 수 있기 때문에 in연산자로 내용을 검사할 필요가 있다.
var data = { fruit:function( ){ }, human:function( ){ } }
console.log( 'fruit' in data ); //결과: true
console.log('electronic' in data ); // 결과 : false
'코드 스터디' 카테고리의 다른 글
자바스크립트 문법 (15) Class (0) | 2019.05.19 |
---|---|
자바스크립트 문법 (14) private, public 프로토타입 객체모델 (0) | 2019.05.18 |
자바스크립트 문법 (12) 객체의 상속(프로토타입 체인) (0) | 2019.05.16 |
자바스크립트 문법 (11) 프로토타입 객체 (0) | 2019.05.15 |
자바스크립트 문법 (10) 객체지향 Class (0) | 2019.05.14 |
댓글