프로토타입

이윤환·2022년 4월 14일
1
post-custom-banner

자바스크립트는 프로토타입 기반 언어다. 클래스 기반 언어에서는 상속을 사용하지만 프로토타입 기반 언어에서는 어떤 객체를 원형으로 삼고 이를 복제함을써 상속과 비슷한 효과를 얻는다.

프로토타입이란?

먼저 자바스크립트의 프로토타입은 다음과 같다.

let instance = new Constructor();

위 코드를 해석하면 다음과 같다

  • 어떤 생성자 함수(Constuctor)를 new 연산자와 함께 호출하면
  • Constructor에서 정의된 내용을 바탕으로 새로운 인스턴스가 생성된다.
  • 이때 instance에는 __proto__ 라는 프로퍼티가 자동으로 부여되는데
  • 이 프로퍼티는 Constructor의 prototype이라는 프로퍼티를 참조한다.

생성자 함수의 prototype에 어떤 메서드나 프로퍼티가 있다면 인스턴스에서도 마치 자신의 것 처럼 해당 메서드나 프로퍼티에 접근이 가능해진다.

즉 Constructor.property와 instance.__proto__는 같은거라고 생각하면 된다.

Constructor 프로퍼티

생성자 함수의 프로퍼티인 prototype 객체 내부에는 constructor 라는 프로퍼티가 있다.
이건 instance의 __proto__ 객체 내부에도 마찬가지다.
이 constructor 라는 프로퍼티는 말 그대로 원래의 생성자 함수(자기 자신)를 참조한다.

let arr = [1,2];
Array.prototype.constructor === Array // true
arr.__proto__.constructor === Array // true
arr.constructor === Array // true

let arr2 = new arr.constructor(3,4);
console.log(arr2); // [3,4]

인스턴스의 __proto__ 가 생성자 함수의 prototype. 프로퍼티를 참조하며 __proto__ 가 생략 가능하기 때문에 인스턴스에서 직접 constructor에 접근할 수 있는 수단이 생긴것이다.
그냥 자신의 생성자 함수가 무엇인지 찾게 해주는 용도다.

(근본을 찾을 수 있다.)

프로토타입 체인

우리가 콘솔창에 어떠한 값을 불러오면


저렇게 [[Prototype]]을 클릭해 펼치면 끝없이 나오는 위 이미지와 같은 코드들을 볼 수 있을 것이다.
잘 보면 bind 나 entries, call 등의 메서드들을 볼 수 있을 것 이다.
우리가 평소에 무심코 사용하던 메서드들이 사실 객체 안에 무수한 프로퍼티와 메서드로 존재한다는 뜻이 된다.
아무튼 어떤 데이터의 __proto__프로퍼티 내부에 다시 __proto__ 프로퍼티가 연쇄적으로 이어진 것을 프로토타입 체인이라고 하고, 이 체인을 따라가면서 검색하는것을 프로토타입 체이닝이라고 한다.

뭐 굳이 알건 없지만 알아서 나쁠건 없으니 적었다.

정리

  • 어떠한 생성자 함수를 new 연산자와 함께 호출하면 새로운 인스턴스가 생성되는데 이 인스턴스에는 __proto__ 라는 Constructor의 prototype 프로퍼티를 참조하는 프로퍼티가 자동으로 부여된다.
  • __proto__ 는 생략이 가능하며, Constructor.prototype의 메서드를 마치 자신의 메서드인 것처럼 할 수 있다.
  • constructor 라는 프로퍼티는 생성자 함수를 가리킨다.
  • __proto 안에 다시 __proto 를 찾아가는 과정을 프로토타입 체이닝이라고 한다.
  • 우리는 프로토타입 체이닝을 통해 가장 가까운 대상부터 시작해서 가장 먼 대상까지의 순서로 상위 생성자의 메서드를 마치 제것인양 호출 할 수 있다.
profile
나는 이윤환
post-custom-banner

0개의 댓글