[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); 메서드 권장
Leave a comment