19. Class

적자생존·2022년 7월 6일
0

javascript restart

목록 보기
20/31

1. Class

기존 객체 생성법

Class로 생성법

달라진점?

class와 constructor를 사용했는데 이는 property로 집어넣고 그 외에는 prototype으로 집어넣는다


기존의 방법의 경우

생성자 함수로 생성을 하면

property로 들어오게 되는데


class로 사용을하면 constructor로 감싸준 부분을 제외하면 모두 prototype으로 들어가게 된다.

2. 기존의 생성자 함수와의 차이점

그럼 기존의 생성자 함수에서 prototype으로 넣어주면 되는거 아닌가??

물론 prototype으로 생성하면 동일하게 showName 부분이 prototype으로 들어갈 수 있음.

가. class생성자에서 new를 사용하지 않으면 에러가 발생한다.

new를 붙히지 않아도 에러가 발생하지 않음

이는 User라는 함수가 반환하는 값이 undefined이기 때문에 그 undefined가 호출 부분에서 들어가서 undefined가 반환되는 것임.

하지만 class 생성자에서는

new를 사용하지 않았다는 타입에러를 발생하게 됨

class생성자로 prototype을 확인하면 constructor 부분에 class가 붙은 것을 명시적으로 확인 할 수 있음

나. for in 문에서 class 생성자로 만든 객체는 prototype이 표시되지 않는다.

3. class의 상속

extends라는 문법을 사용한다.

Car에서 선언된 constructor는 바로 property로 들어있고 extends로 상속한 park()의 경우는 바로 하위의 prototype으로 Car에서 선언된 prototype의 경우는 그 최하단의 prototype으로 선언되어 있다.

4. 메소드 오버라이딩

동일한 이름으로 메소드를 정의하면 덮어써진다.

부모와 동일한 메소드를 지정하면

자식꺼로 덮어씌워진다.

하지만 동일한 이름을 굳이 사용해야 한다면??

super이라는 메소드가 있다.


super을 사용하게 되면 둘다 나오게 된다.

이런 방식을 메소드 오버라이딩이라고 한다.

5. constructor 오버라이딩

extends로 작성한 문법에서 constructor를 새로 만들어주면 다음과 같이 에러가 발생한다.

이를 해결하기 위해서는

super()를 이용해서 부모 객체의 constructor를 호출해줘야 한다.

하지만 여기서 Bmw의 값으로 "red"를 넣었지만 undefined가 호출이 된다.

이는 상속된 Bmw의 constructor에 부모와 동일한 파라미터를 넣어줘야 하기 때문이다.

Bmw의 constructor와 super에 color를 넣어줬더니 잘 작동하는 모습이 보인다.

가. 작동방식


처음에 자식 객체에서는 constructor가 없기 때문에 내부동작으로 부모의 constructor가 있는 것처럼 만들어 진다.

constructor가 있는 경우에는 위의 작업이 실행되지 않기 때문에 따로 부모의 constructor를 호출해야 사용할 수 있다.

profile
적는 자만이 생존한다.

0개의 댓글