[240321] 19장 프로토타입

19장 프로토타입

  • 자바스크립트는 명령형, 함수형, 프로토타입 기반, 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어다.
  • C++ → 클래스 기반 객체지향 프로그래밍 언어
  • JS → 프로토타입 기반 객체지향 프로그래밍 언어
  • js 를 이루고 있는 거의 모든 것이 객체다 (원시 값 제외)

객체지향 프로그래밍

  • 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임
  • 객체: 상태(프로터피), 동작(메서드)을 하나의 논리적인 단위로 묶은 복합적인 자료구조

상속과 프로토타입

  • 코드의 재사용이란 관점에서 유용
  • 부모 객체인 프로토타입의 자산을 공유하여 사용할 수 있다.
function Circle(radius) {
	this.radius = radius;
	// 인스턴스가 매번 중복 생성
	this.getArea = function() {}
}

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

// Circle2 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는
// 프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다.
// 즉, Circle 생성자 함수가 생성하는 모든 인스턴스는 하나의 getArea 메서드를 공유한다.
Circle2.prototype.getArea = function () {
	return Math.PI * this.radius ** 2;
};

프로토타입 객체

  • 상속을 구현하기 위해 사용
  • 모든 객체는 [[Prototype]] 내부 슬롯 가짐
    • 저장되는 프로토타입은 객체 생성 방식에 의해 결정
    • 생성될때 저장
    • 직접 접근할 수 없지만 proto 접근자 프로퍼티를 통해 자신의 프로토타입에 간접적으로 접근할 수 있다.
  • 모든 프로토타입은 생성자 함수와 연결되어 있다.

proto 접근자 프로퍼티

  • 위 접근자 프로퍼티를 통해 자신의 프로토타입에 간접적으로 접근 가능
  • 자체적으로 값([[value]] 프로퍼티 어트리뷰트)를 갖지 않고, 접근자 함수([[Get]], [[Set]]) 프로퍼티 어트리뷰트로 구성된다.

  • proto 접근자 프로퍼티는 상속을 통해 사용된다.
    • proto 프로퍼티는 객체가 직접 소유하는 프로퍼티가 아님 **
    • Object.prototype 의 프로퍼티다. 모든 객체는 상속을 통해 사용 가능
  • proto 접근자 프로퍼티를 통해 프로토타입에 접근하는 이유
    • 순환 참조하는 프로토타입이 만들어지면 검색할 때 무한루프에 빠진다. 따라서 무조건적으로 프로토타입을 교체할 수 없도록 __proto__접근자 프로퍼티를 통해 프로토타입에 접근하고 교체하도록 구현되어있다.
  • proto 접근자 프로퍼티를 코드내에서 직접 사용하는 것은 권장하지 않는다.
    • Object.getPrototypeOf(obj); 메서드 권장
    • Object.setPrototypeOf(obj); 메서드 권장

Categories:

Updated:

Leave a comment