기존 객체 생성법
Class로 생성법
class와 constructor를 사용했는데 이는 property로 집어넣고 그 외에는 prototype으로 집어넣는다
기존의 방법의 경우
생성자 함수로 생성을 하면
property로 들어오게 되는데
class로 사용을하면 constructor로 감싸준 부분을 제외하면 모두 prototype으로 들어가게 된다.
그럼 기존의 생성자 함수에서 prototype으로 넣어주면 되는거 아닌가??
물론 prototype으로 생성하면 동일하게 showName 부분이 prototype으로 들어갈 수 있음.
new를 붙히지 않아도 에러가 발생하지 않음
이는 User라는 함수가 반환하는 값이 undefined이기 때문에 그 undefined가 호출 부분에서 들어가서 undefined가 반환되는 것임.
하지만 class 생성자에서는
new를 사용하지 않았다는 타입에러를 발생하게 됨
class생성자로 prototype을 확인하면 constructor 부분에 class가 붙은 것을 명시적으로 확인 할 수 있음
Car에서 선언된 constructor는 바로 property로 들어있고 extends로 상속한 park()의 경우는 바로 하위의 prototype으로 Car에서 선언된 prototype의 경우는 그 최하단의 prototype으로 선언되어 있다.
동일한 이름으로 메소드를 정의하면 덮어써진다.
부모와 동일한 메소드를 지정하면
자식꺼로 덮어씌워진다.
super을 사용하게 되면 둘다 나오게 된다.
이런 방식을 메소드 오버라이딩이라고 한다.
extends로 작성한 문법에서 constructor를 새로 만들어주면 다음과 같이 에러가 발생한다.
이를 해결하기 위해서는
super()를 이용해서 부모 객체의 constructor를 호출해줘야 한다.
하지만 여기서 Bmw의 값으로 "red"를 넣었지만 undefined가 호출이 된다.
이는 상속된 Bmw의 constructor에 부모와 동일한 파라미터를 넣어줘야 하기 때문이다.
Bmw의 constructor와 super에 color를 넣어줬더니 잘 작동하는 모습이 보인다.
처음에 자식 객체에서는 constructor가 없기 때문에 내부동작으로 부모의 constructor가 있는 것처럼 만들어 진다.
constructor가 있는 경우에는 위의 작업이 실행되지 않기 때문에 따로 부모의 constructor를 호출해야 사용할 수 있다.