포스트

자바스크립트 클래스

class

  • ES 6에 추가된 스펙
  • new 를 통해서 호출할 때 내부에서 정의된 내용으로 객체를 생성한다.
  • class라는 키워드와 내부에 constructor 가 있다.
  • constructor는 객체를 만들어 주는 생성자 메소드이다.
  • new 를 통해 호출하면 자동으로 실행된다.
  • 객체를 초기하기 위한 값이 정의 되고 인수를 넘겨받을 수 있다.
  • 클래스 내에 정의한 메소드는 프로토타입에 저장이 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class User {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    showName() {
        console.log(this.name);
    }
}

const john = new User("John", 19);

// 생성자 함수
const User2 = function (name, age) {
    this.name = name;
    this. age = age;
}

User2.prototype.showName = function () {
    console.log(this.name);
};

const Mike = new User("Mike", 30);

생성자 함수와 클래스의 차이점

  • prototype 의 constructor 에 new 없이 호출하면 에러가 발생되도록 설계 되었다.
  • 클래스는 class 라고 명시가 되어 있다.
  • class 의 메소드는 for-in 문에서 제외된다.

상속

  • z4.dirve()를 실행하면 z4 객체에서 찾고 프로토타입에서 찾아보고 없으면
  • 또 prototype에서 찾아봐서 실행이 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Car {
    constructor(color) {
        this.color = color;
        this. whells = 4;
    }
    drive() {
        console.log("drive..");
    }
    stop() {
        console.log("STOP!");
    }
}

class Bmw extends Car {
    park() {
        console.log("PARK");
    }
}

const z4  = new Bmw("blue");

메소드 오버라이딩(method overriding)

  • 만약 동일한 이름의 메소드가 존재 하는 경우 발생한다.
  • 덮어씌우게 된다.
  • 부모의 이름을 그대로 쓰면서 확장하고 싶을 때는 super 를 사용하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Car {
    constructor(color) {
        this.color = color;
        this. whells = 4;
    }
    drive() {
        console.log("drive..");
    }
    stop() {
        console.log("STOP!");
    }
}

class Bmw extends Car {
    park() {
        console.log("PARK");
    }
    stop() {
        super.stop;
        console.log("OFF");
    }
}

생성자 오버라이딩

  • constructor 는 부모 생성자를 반드시 먼저 호출해야한다.
  • 클래스의 constructor 는 빈 객체로 만들어지고 this 로 이 객체를 가르키게 된다.
  • extends 를 써서 만든 자식 클래스는 빈 객체를 만들어지고 this 로 할당하는 작업을 건너 뛴다.
  • 그래서 항상 super 키워드로 부모 class 의 constructor 를 실행해주어야 한다.
  • 생성할 때 자식 클래스의 constructor 에 동일한 인수를 갖는 작업을 해주어야 undefined 가 뜨지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Car {
    constructor(color) {
        this.color = color;
        this. whells = 4;
    }
    drive() {
        console.log("drive..");
    }
    stop() {
        console.log("STOP!");
    }
}

class Bmw extends Car {
  
  constructor(color) {
    super(color);
    this.navigation = 1;
  }

  park() {
        console.log("PARK");
    }
}
  • 만약 constructor 가 없으면 이 부분이 있는 것처럼 행동한다.
  • 자식 생성자에 constructor 가 있으면 super 로 호출해주고 this. 프로퍼티로 할당해주어야 한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    class Bmw extends Car {
        
      // 자동으로 생성되는 구문
      constructor(...args) {
          super(...args);
      }
    
      park() {
          console.log("PARK");
      }
    }
    

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.