ES6 클래스

# Polymorphism

const Worker = class {
  run() { console.log('working'); }
  print() { this.run(); }
};

const HardWorker = class extends Worker {
  run() { console.log('hardWorking'); }
};

const hardWorker = new HardWorker();
1
2
3
4
5
6
7
8
9
10

# Polymorphism: "대체 가능성" substitution

console.log(hardWorker instanceof Worker);  // true 
1

true 인 이유 ->

  • sub 는 super 를 대체할 수 있다.
  • super 는 sub 를 대체할 수 없다.
  • (extend) HardWorker 의 부분집합이 Worker 이다.
  • 확장한 클래스는 확장될 클래스를 대체할 수 있다.

# Polymorphism: "내적 일관성" internal identity

hardWorker.print();  // hardworking
1

this 는 worker 클래스의 print() 안에 있지만, 여전히 hardWorker 의 this 를 가리킨다.

  • this 의 특징 → 호출 문맥에 결정되며, 바뀌지 않는다.

# 객체지향 언어의 Polymorphism

Substitution & internal identity

  • 확장된 객체는 원본으로 대체 가능
  • 생성시점의 타입이 내부에 일관성 있게 참조됨

두가지 특성을 가지지만 언어마다 구현 방법이 다르다.

  • 자바스크립트는 내부에 Prototype 시스템을 가진다.

# Polymorphism of Prototype

프로토타입 체인을 통해서 내적 일관성을 달성하게 된다.
worker 인스턴스가 태어날 때, 가장 가까운 HardWorker Prototype 으로 결정 image

프로토타입 체인을 통해서 대체 가능성을 달성한다. image image

자바스크립트는 Polymorphism 이 성립 → 객체지향 언어