객체 지향 패턴으로 작성하면 데이터와 기능을 직관적으로 이해할 수 있고 불필요한 많은 내용을 반복적으로 작성하지 않고 재사용하기 용이하다.
동일한 prototype(class)를 찍어내어 여러 instance object를 만들 수 있다.
객체지향 프로그래밍의 네가지 주요 컨셉
- Encapsulation
- Inheritance
- Abstraction
- Polymorphism
class 클래스 extends 부모클래스 { // 상속받아 확장시키겠다
constructor(속성들 ...) { // 초기값 설정
super(상속받을 속성들 ...)
// 상속받은 속성들을 사용하려면 super()
this.OOO = OOO;
this.XXX = XXX;
...
}
메소드(){
return super.상속받은메소드() + ... ;
// 상속받은 메소드를 사용하려면 super.
}
}
let 공장에서_찍어낸것중_하나 = new 클래스(이속성, 저속성 ...)
Prototype
과 __proto__
class를 한번 만들면 클래스
이라는 객체(함수로서 존재), 클래스의 prototype
(찍어내는 공장)이라는 객체가 생성된다.
이 둘은 서로를 참조한다.
클래스
에는 자동으로 prototype
이라는 속성이 생기고 이것은 클래스의 prototype
을 가리킨다.
반대로 클래스의 prototype
에는 constructor
가 담기며
이것은 클래스
를 가리킨다.
클래스.prototype.constructor === 클래스
를 이해할 수 있다.
만약 이 class에 메소드를 추가한다면 공장에 추가된다. 즉 클래스의 prototype
에 들어가는 것이다.
그냥 클래스
에서 메소드를 찾아보려해도 찾을 수 없다. 왜냐면 클래스
는 초기값 속성들로만 이루어진 함수니까!
그래서 function으로 객체 생성 시 메소드를 정의하고자 할 때
클래스.prototype.메소드 = 어쩌구저쩌구
라고 썼던 것이다!
class를 이용해 새로운 객체인 클래스공장출신객체
를 찍어냈다고 생각해보자. 찍혀진 객체는 자동으로 추가적인 속성인 __proto__
을 가진다.
이 __proto__
는 어떤 공장 출신인지 나타내준다. 즉, 클래스의 prototype
을 가리킨다.
클래스공장출신객체.__proto__ === 클래스.prototype
이 그 말이다!
그리고 이 클래스공장출신객체
는 출신 공장의 메소드를 쓸 권한이 있다.
자신(정확히는 자신의 prototype)이 가진 메소드는 B뿐이더라도, 공장(클래스 prototype)에서 A 메소드를 사용한다면 이 객체는 A 메소드를 사용할 수 있다.
클래스공장출신객체.객체에겐없는메소드 === 클래스.prototype.객체에겐없는메소드
참고영상