ES6 Class 파헤치기 라는 글을 읽고 참고해서 다시 정리해 보았다. 좋은 글 감사합니다.
Class
- JavaScript Class는 ECMAScript 6에서 소개되었다.
- Class 도 함수다. 함수를 선언식과 표현식으로 정의하는 것처럼 Class도 두 가지로 정의할 수 있다.
- instance의 속성은 반드시 class method 내에 정의되어야 한다.
Class 선언식
- 함수 선언과 클래스 선언의 중요한 차이점은 함수 선언의 경우 호이스팅이 일어나지만, 클래스 선언은 그렇지 않다는 것이다.
- 클래스를 사용하기 위해서는 클래스를 먼저 선언 해야 하며, 그렇지 않으면 ReferenceError가 발생한다.
class Car {
constructor(band, name){
this.brand = brand;
this.name = name;
}
drive() {
console.log(this.name + ' is driving now.')
}
}
클래스를 선언하기 전에 'new Car()' 처럼 instance를 먼저 생성하면 ReferenceError가 발생한다.
Class 표현식
let Car = class Car { // 표현식은 이름을 가지지 않을 수도 있다.
constructor(brand, name){
this.brand = brand;
this.name = name;
}
drive() {
console.log(this.name + ' is driving now.');
}
}
Constructor
Class의 instance를 생성하고 초기화하는 역할을 하며 클래스 안에서 한 개만 존재할 수 있다.
클래스로부터 object를 만드는 역할을 한다.
let avante = new Car('hyundai', 'avante');
new Car() 코드를 실행하면 Car.prototype.constructor가 호출되어서 'hyundai', 'avante'를 파라미터로 넘겨주게 된다.
prototype 기반 상속 vs. Class 기반 상속 ( ES 5 vs. ES 6)
1. prototype 기반 상속 (ES5)
function Car(name) {
this.name = name;
}
Car.prototype.honk = function() {
console.log('honk honk!')
}
function Avante(name){
Car.call(this, name); // 이렇게 명시해 주어야 inastance의 this가 Car의 this를 바라본다.
}
// Car Class 상속
Avante.prototype = Object.create(Car.prototype); // Car prorotype객체를 base로 Avante prototpye 생성
Avante.prototype.constructor = Avante; // Car prototype이 base이지만 constructor는 Avante임을 명시
// drive() method override
Avante.prototype.honk = function() {
Car.prototype.honk.call(this);
console.log('beep beep!');
};
let avante1 = new Avante('avante1');
avante1.honk();
//output
honk honk!
beep beep!
2. Class 기반 상속 (ES 6)
- extends 키워드를 통해 클래스를 상속할 수 있다.(sub classing)
- subclass에 constructor가 있으면 this를 사용하기 전에 먼저 super()를 호출해야 한다.
- super 키워드는 객체의 부모가 가지고 있는 함수들을 호출하기 위해 사용한다.
class Car {
constructor(name){
this.name = name;
}
honk() {
console.log('honk honk!');
}
}
// Car Class 상속
class Avante extends Car { // extends 키워드로 상속을 구현함
honk() {
super.honk(); // super class의 constructor 호출
console.log('beep beep!');
}
}
let avante1 = new Avante('avante1');
avante1.honk();
//output
'honk honk!' //line 13 super.honk()가 없으면 출력되지 않음
'beep beep!'
- constructor의 내용이 부모의 것과 같으면 자식 클래스에서는 생략할 수 있다.
- super 키워드 괄호 안에는 상속받는 값이 있을 경우에 명시해 준다.
Polymorphism : 다형성
: when a method inherited from a base class is redefined.
superclass에서 이미 정의된 값도 출력하고 subclass에서 새로 정의한 것도 출력하고 싶은 경우
- 대표적으로 overloading, overriding이 있다.
Overriding
: 부모-자식 상속 관계에서만 가능하며, 부모 클래스에 있는 매서드를 자식 클래스에서 재정의해서 사용하는 것을 의미한다.
1. pseudoclassical pattern
function Human(name){
this.name = name;
}
Human.prototype.sleep = function(){
console.log('zzz');
}
function Student(name){
Human.apply(this, name);
}
Student.prototype.sleep = function() {
Human.prototype.sleep.apply(this); //Human과 Student에 있는 각 메소드를 같은 context가 공유
console.log('wake up!');
}
2. ES 6 Class 활용
class Human {
constructor(name) {
this.name = name;
}
sleep() {
console.log('zzz');
}
}
class Student extends Human {
sleep(){
super.sleep();
console.log('wake up');
}
}
let steve = new Student('steve')
steve.sleep()
//ouput
zzz
wake up!
'TIL ( CODESTATES)' 카테고리의 다른 글
Kahoot Review - Inheritance pattern (0) | 2020.11.19 |
---|---|
pseudoclassical vs.ES 6 class 인스턴스화와 상속 (sprint) (0) | 2020.11.16 |
Instantiation Patterns (0) | 2020.11.12 |
OOP (Object Oriented Programming), concept, prototype (0) | 2020.11.12 |
Complexity Analysis - 시간복잡도, Big-O Notation (0) | 2020.11.12 |