인프런 강의 자바스크립트 중급 - 코딩앙마 를 듣고 정리한 내용입니다.
비슷한 형태의 객체를 만들기 위해 생성자 함수를 사용했습니다.
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 는 ES6 에 추가된 스펙으로 위 생성자 함수의 같은 역할을 합니다. 위 생성자 함수를 Class 를 활용해서 다시 써보면,
class User2 {
constructor(name, age) {
this.name = name;
this.age = age;
}
showName() {
console.log(this.name);
}
}
const tom = new User2("Tom", 19);
class 내부에는 객체를 만들어 주는 생성자 메소드 constructor 가 있습니다. 이 생성자 메소드에 포함되지 않은 값은 객체 내부가 아닌 프로토타입에 저장됩니다. class 로 객체를 만들 때 new 없이 실행하면 에러가 발생해서 알려줍니다. 생성자 함수를 위 class 처럼 동작하게 하려면 아래처럼 수정해야 합니다.
const User = function (name, age) {
this.name = name;
this.age = age;
};
User.prototype.showName = function() { // 프로토타입으로 따로 저장해주어야
console.log(this.name);
}
const mike = new User("Mike", 30);
생성자 함수에서 상속을 프로토타입으로 구현했다면, class 에서는 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");
위 코드에서 z4 를 확인하면 Car 클래스에서 선언한 color wheels 가 있고, 프로토타입을 보면 park() 가 있고, 그 아래 상속으로 drive() stop() 이 있습니다.
메소드 오버라이딩 method overriding 을 알아보면,
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");
}
stop() { // 이렇게 중복되는 함수를 추가한다면 어떨까?
console.log("off..") ;
}
}
const z4 = new Bmw("blue");
이럴 경우 z4.stop() 은 stop 이 아니라 off 를 출력합니다. 동일한 이름의 메소드가 있다면 상속받기 전 단계에 있는 값을 사용합니다.부모의 메소드를 사용하고 싶다면 super 를 사용합니다.
생성자 constructo 오버라이딩을 해보면
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);
// 이렇게 super 써서 부모 요소처럼 빈 객체 생성하고 시작해야 함, 매개변수 color 도 그대로 입력
this.navigation = 1;
}
park() {
console.log("park");
}
}
const z4 = new Bmw("blue");
기본적으로 자식요소에 constructor 을 써주지 않으면, 우리 눈에 보이지 않게 실행되지만, 위와 같이 입력을 한다면 super 를 사용하고 매개변수도 입력해주어야 한다.