[모던 자바스크립트 Deep Dive] 19장. 프로토타입

Benza·2022년 10월 13일
0
post-thumbnail

자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어다.

19.1. 객체지향 프로그래밍

객체지향 프로그래밍은 여러개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.

속성(attribute/property): 특징이나 성질
추상화: 필요한 속성만 간추려 내어 표현하는 것

객체: 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조

19.2. 상속과 프로토타입

상속(inheritance)은 객체지향 프로그래밍의 핵심 개념으로, 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다.
즉 상속으로 코드를 재사용하여 중복을 제거할 수 있다.

19.3. 프로토타입 객체

상속을 구현하기 위해 사용
모든 객체는 [[prototype]]이라는 내부 슬롯을 가지며, 이 내부 슬롯의 값은 프로토타입의 참조다
[[prototype]]에 저장되는 프로토타입은 객체 생성 방식에 의해 결정된다. 즉, 객체가 생성될 때 객체 생성 방식에 따라 프로토타입이 결정되고 [[prototype]]에 저장된다.

19.3.1. __proto__ 접근자 프로퍼티

모든 객체는 __proto__ 접근자 프로퍼티를 통해 자신의 프로토타입, 즉 [[prototype]] 내부 슬롯에 간접적으로 접근할 수 있다.

접근자 프로퍼티는 자체적으로 값([[value]] 어트리뷰트)을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수, 즉 [[get]], [[set]] 프로퍼티 어트리뷰트로 구성된 프로퍼티다.

__proto__는 getter, setter 졉근자 함수를 통해 [[prototype]]` 내부 슬롯의 값(프로토타입)을 취득하거나 할당한다.

  • __proto__ 접근자 프로퍼티는 상속을 통해 사용된다.
  • __proto__ 접근자 프로퍼트를 통해 상호 참조에 의해 프로토타입 체인이 생성되는 것을 방지한다.
    • 프로토타입 체인은 단방향 링크드 리스트로 구현되어야한다.
    • 순환 참조하는 프로토타입 체인은 체인의 종점이 없기 때문에 무한 루프에 빠진다.
  • __proto__ 접근자 프로퍼티를 코드 내에서 직접 사용하는 것은 권장하지 않는다.
    • 직접 상속을 통해 Object.prototype을 상속받지 않는 객체를 생성할 수도 있다.
    • Object.getPrototypeOf 메서드로 참조값을 취득해라
    • Object.setPrototypeOf 메서드로 프로토타입을 교체 할 수 있다. (ES6)

19.3.2. 함수 객체의 prototype 프로퍼티

함수 객체만이 소유할는 prototype프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다.

non-constructor인 화살표 함수와 ES6메서드 축약 표현은 prototype프로퍼티를 소유하지 않으며 프로토타입도 생성하지 않는다.

19.3.3. 프로토타입의 constructor 프로퍼티와 생성자 함수

19.3.4. 리터럴 표기법에 의해 생성된 객체의 생성자 함수와 프로토타입


리터럴 표기법으로 생성된 객체도 프로토타입이 존재한다.
리터럴 표기법으로 생성된 객체의 경우 프로토타입의 constructor 프로퍼티가 가리키는 생성자 함수가 반드시 객체를 생성한 생성자 함수라고 단정할 수는 없다.

Object


참고

profile
Understanding the impression

0개의 댓글