지금까지 비슷한 형태의 객체를 생성하기 위해 생성자 함수를 사용함.

클래스를 이용해 객체를 생성하면

new를 사용했을때 내부에서 정의된 내용으로 객체를 만드는건 동일함.










for in 문은 프로토타입을 포함한 프로퍼티를 다 보여주고, 객체만 가지고 있는 프로퍼티를 판별하기 위해 hasOwnProperty를 사용함.
그런데 class 메소드는 for in 문에서 제외됨.
생성자 함수는 프로토타입을 이용해 상속을 구현함.


class Car{
constructor(color){
this.color = color;
this.wheels = 4;
}
drive(){
console.log("drive");
}
stop(){
console.log("stop!")
}
}
class Bmw extends Car{
park(){
console.log("park!")
}
}
const z4 = new Bmw('blue');
만약 Bmw에 Car에서 정의한 이름과 동일한 메소드가 존재한다면? 덮어쓺(오버라이딩)

stop이 bmw,car 자식클래스, 부모클래스 둘다에 존재한다면?
bmw로 생성한 객체 z4에서 stop호출시 bmw(자식클래스)에 있는 stop나옴.
즉 car를 상속받은 bmw꺼에 정의한 stop으로 덮어쓰게 됨
만약 부모의 메소드를 사용하면서 확장하고 싶다면? super() 사용

super() 추가시, car에 있는 stop도 나오고 z4에 있는 stop도 나옴.
super.메소드명() 으로 부모클래스에 있는 메소드를 사용할 수 있음.
이러한 방식을 오버라이딩이라고 함.
class 부모 extends 자식{
constructor(부모클래스의 인수){
super(부모클래스의 인수);
this.자식클래스에서 만들고싶은 프로퍼티이름 = 값 혹은 인수로받은 값;
}

z4 생성시 부모클래스로부터 온 인수, 자식클래스에서 필요한 인수 넣어줌.

class의 constructor는 빈객체를 만들고 this로 그 객체를 가르키게 됨.
반면 extends로 만든 자식클래스는
빈객체가 만들어지고 this에 할당하는 작업을 건너뜀.
그래서 항상 super()로 부모클래스의 생성자를 실행해줘야함.

그래서 super를 호출해줬는데
그런데 z4를확인해보면, color가 undefined됨. 분명 생성할때 blue넣어줬는데도 그럼.
제대로 동작하기 위해서는 자식클래스의 constructor에 동일한 인수를 받는 작업을 해주어야 함.

위와 같이 자식클래스의 생성자에도 color를 받고 super에 넘겨줘야함.

잘 들어감.

자식클래스에 constructor가 생겼을때 저런식으로 처리되지 않으니까 항상 super를 이용해서 호출해주고 this. property로 할당해줘야함.
class Car{
constructor(color){
this.color = color;
this.wheels = 4;
}
drive(){
console.log("drive");
}
stop(){
console.log("stop!")
}
}
class Bmw extends Car{
constructor(color){
super(color);
this.navigation =1;
}
park(){
console.log("park!")
}
}
const z4 = new Bmw('blue');
