자바스크립트는 클래스 기반 객체지향 프로그래밍 언어보다 효율적이며 더 강력한 객체지향 프로그래밍 능력을 지니고 있는 프로토타입 기반의 객체지향 프로그래밍 언어이다.

19.1 객체지향 프로그래밍

객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임

객체지향 프로그래밍:

상태 데이터(객체의 상태를 나타냄)

동작(상태 데이터를 조작할 수 있음)

19.2 상속과 프로토타입

인스턴트가 동일한 내용의 매소드를 사용할 때, getArea 메서드가 중복 생성되는 문제가 있다.

→ 상속을 통해 불필요한 중복을 제거할 수 있다.

자바스크립트는 프로토타입을 기반으로 상속을 구현

function Circle(radius) {
	this.radius = radius;
}

Circle.prototype.getArea = function() {
	return MATH.PI * this.radius ** 2;
};

const circle1 = new Circle(1);
const circle2 = new Circle(2);

 console.log(circle1.getArea === circle2.getArea); //-> true

Circle 생성자 함수가 생성한 모든 인스턴스(circle1, circle2)는 자신의 상위 객체 역활을 하는 Circle, prototype의 모든 프로퍼티와 메서드를 상속받는다.

19.3 프로토타입 객체

모든 객체는 [[Prototype]]이라는 내부 슬롯을 가진다.

모든 객체는 하나의 프로토타입을 가지며, 내부 슬롯에 직접적 접근은 불가하지만, __proto__접근자 프로퍼티를 통해 내부 슬롯이 가리키는 프로토타입에 간접적으로 접근할 수 있다.

프로토타입 체인은 단방향 링크드 리스트로 구현되어야 한다.

→ 접근자 프로퍼티(proto)를 사용해서 상호 참조에 의해 쌍방향 리스트 프로토타입 체인이 생성되는 것을 방지하기 위해서이다.