JavaScript 의 Class는 ES6에 추가된 스펙이다.
const User = function(name,age){
this.name = name;
this.age = age;
this.showName = function() {
console.log(this.name);
};
};
const mike = new User("Mike",30);
class User2 {
constructor(name,age) {
this.name = name;
this.age =age;
}
showName () {
console.log(this.name);
}
}
const tom = new User2("Tom", 19);
클래스로 작성한 문법을 이용해 객체를 생성하게 되면 클래스 내부의 showName() 메소드는
User2의 프로토타입에 저장되게 된다. 따라서 위에서mike객체는 객체 내부에 showName() 메소드가 있지만 ,tom객체는 내부의 프로토타입에 showName() 메소드가 저장되어 있다.
--> 동일하게 만드려면
const User = function(name,age){
this.name = name;
this.age = age;
};
User.prototype.showName = function() {
console.log(this.name);
};
클래스와 달리 일반 생성자 함수를 사용하게 되면 객체를 생성할 때
new 생성자함수("","") 이런식으로 작성하지 않고 new 를 빼게되면 undefined를 출력하는데,
이는 분명히 개발자의 실수임에도 오류를 즉시 잡아낼 수 없다.그러나 클래스는 new 연산자 없이 객체를 생성하게 되면 바로 오류를 출력해주기 때문에 기존 생성자 함수의 문제를 해결해준다고 볼 수 있다.
extends 키워드를 사용하여 상속한다.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 내부 프로토타입에 park() 메소드가 저장되고 , 상속된 prototype에 drive() 와 stop() 메소드가 저장된다.
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");
}
stop() {
//super.stop();
console.log("OFF");
}
}
const z4 = new Bmw("blue");
해당 코드에서 z4.stop()을 실행하면 OFF를 출력한다.
만약 부모의 메소드를 그대로 사용하고 싶다면 super 키워드를 이용한다.
만약 상속한 자식 클래스에서 생성자 함수를 오버라이딩 한다면 꼭 super를 통해 부모의 생성자 함수를 실행시켜야 오류가 발생하지 않는다.
그러나 위와 같이 생성자 함수를 실행해도 color 프로퍼티는 undefined 로 지정되는데 이를 해결하려면,
자식의 생성자 함수에서 마찬가지로 color 를 인자로 받아 부모의 생성자 함수로 color 를 넘겨주어야 한다.