Prototype
JavaScript는 Prototype 기반 객체지향 프로그래밍 언어이다.
ES6에서 Class가 도입되었으나 ES6의 Class가 기존의 Prototype 기반 객체지향 모델을 대체하는 것은 아니다.
사실 Class도 Function이며 기존 Prototype 기반 패턴의 일종이다.
Prototype, Class
JavaScript는 Class라는 개념이 존재하지 않는다. 대신 Prototype이라는 것이 존재한다.
Class라는 개념이 없으므로 상속이란 기능도 존재하지 않는다. 따라서 Prototype을 기반으로 상속을 구현하여
중복을 제거한다. 여기서도 마찬가지로 ES6부터 Class가 도입됐다고 해서 JavaScript가 Class기반으로 바뀌는 것은 아니다.
// Constructor function
function Circle(radius) {
this.radius = radius
this.getArea = function() {
return Math.PI * this.radius ** 2
}
}
const c1 = new Circle(1)
const c2 = new Circle(2)
// Circle 생성자 함수는 인스턴스를 생성할 때마다 같은 동작을 하는
// getArea 메소드를 중복 생성하고 모든 인스턴스가 중복 소유한다.
// 따라서 위와 같은 메소드는 하나만 생성하여 모든 인스턴스가 공유하는 것이 바람직하다.
console.log(c1.getArea === c2.getArea) // false
// Using prototype
function Circle(radius) {
this.radius = radius
}
Circle.prototype.getArea = function() {
return Math.PI * this.radius ** 2
}
const c1 = new Circle(1)
const c2 = new Circle(2)
console.log(c1.getArea === c2.getArea) // true
Prototype Object는 일반적인 객체이므로 속성을 추가/삭제 할 수 있다.
proto 접근자 프로퍼티
모든 객체는 proto 접근자 프로퍼티를 통해 자신의 프로토타입, 즉 Prototype 내부 슬롯에 간접적으로 접근할 수 있다.
proto 는 객체가 생성될 때 조상이었던 함수의 Prototype Object를 가리킨다. 이렇게 상위 Prototype과 연결되어 있는 형태를
프로토 체인이라고 한다. 이러한 Prototype 체인 구조 때문에 모든 객체는 Object의 자식이라 불린다. 따라서 Object의 모든 속성을
사용할 수 있다.
- ex) toString() 함수
'IT > JavaScript' 카테고리의 다른 글
Static (0) | 2022.09.12 |
---|---|
Optional chaining (0) | 2022.08.29 |
Shallow copy && Deep copy (0) | 2022.08.11 |
Functional programming (0) | 2022.08.09 |
Lexical Environment (0) | 2022.07.30 |