instaceof 연산자
- instaceof 연산자를 사용하면 객체가 특정 클래스에 속하는지 아닌지를 확인할 수 있다 또한 상속 관계도 확인해준다
- 확인 기능은 다양한 곳에서 쓰이는데 이번 챕터에선 instaceof를 사용해 인수의 타입에 따라 이를 다르게 처리하는 다형적인 함수를 만드는데 사용할 수 있다.
- 기본 문법은 위와 같다
- rabbit이 Rabbit 클래스에 속하기 때문에 true를 반환 만약 Rabbit 를 상속받는 클래스에 속해도 true를 반환
- 위와 같이 생성자 함수에서도 사용할 수 있다.
- Array 같은 내장 클래스에서도 사용할 수 있다.
- 위 예시에서 arr은 클래스 Object에도 속한다는 점을 주의해야 한다 Array는 프로토타입 기반으로 Object를 상속받는다
- instaceof 연산자는 보통 프로토타입 체인을 거슬러 올라가며 인스턴스 여부나 상속 여부를 확인한다 그런데 정적 메서드 Symbol.hasInstace를 사용하면 직접 확인 로직을 설정할 수도 있다.
obj instaceof Class의 동작 알고리즘
1 클래스에 정적 메서드 Symbol.hasInstance가 구현되어 있으면 obj.instaceof Class 문이 실행될 때
cClass[Symbol.hasInstace](obj)가 호출된다 호출 결과는 true나 false이어야 한다 이런 규칙을 기반으로 instaceof의 동작을 커스터 마이징 할 수 있다.
2 그런데 대부분의 클래스엔 Symbol.hasInstace가 구현되어 있지 않다 이럴 땐 일반적인 로직이 사용된다
Obj instaceof Class는 Class.prototype이 obj 프로토타입 체인 상의 프로토타입 중 하나와 일치하는지 확인한다
- 위 예시에서 rabbit__proto__ === Rabbit.prototype가 true이기 때문에 instanceof는 true를 반환한다.
- 만약 상속받은 클래스를 사용하는 경우에는 주석에서 2번째 단계에서 일치 여부가 확인된다.
- 위 그림은 rabbit instaceof Animal을 실행했을때 Animal.prototype과 비교되는 대상들을 보여준다
objA.isPrototypeOf(objB)
- objA.isPrototyprOf(objB)는 objA가 objB의 프로토타입 체인 상 어딘가에 있으면 true를 반환해주는 메서드이다
- 즉 obj instaceof Class는 Class 생성자를 제외하고 포함 여부를 검사하는 점이 조금 특이하다 검사 시 프로토타입 체인과 Class.prototype만 고려한다
- isPrototypeOf의 이런 특징은 객체 생성 후 prototype 프로퍼티가 변경되는 경우 특이한 결과를 초래한다.
'자바스크립트' 카테고리의 다른 글
[Javascript] - 콜백 (0) | 2022.11.20 |
---|---|
[Javascript] - try & catch와 에러 핸들링 (0) | 2022.11.12 |
[Javascript] - require vs import (0) | 2022.10.08 |
[Javascript] - private, protected (0) | 2022.10.02 |
[Javascript] - 클래스 상속 (0) | 2022.09.29 |