
오늘은 객체 지향 프로그래밍 마지막 날 !
오전에 프로토타입 공부와 오후에는 Beesbeesbees 과제까지 마무리 했다!
클래스 상속을 사용하면 클래스를 다른 클래스로 확장할 수 있습니다.
기존에 존재하던 기능을 토대로 새로운 기능을 만들 수 있죠.
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name} 은/는 속도 ${this.speed}로 달립니다.`);
}
stop() {
this.speed = 0;
alert(`${this.name} 이/가 멈췄습니다.`);
}
}
let animal = new Animal("동물");
객체 animal과 클래스 Animal의 관계를 그림으로 나타내면 다음과 같습니다.또 다른 클래스 Rabbit을 만들어보겠습니다.클래스 확장 문법 class Child extends Parent를 사용해 클래스를 확장해 봅시다.
class Rabbit extends Animal {
hide() {
alert(`${this.name} 이/가 숨었습니다!`);
}
}
let rabbit = new Rabbit("흰 토끼");
rabbit.run(5); // 흰 토끼 은/는 속도 5로 달립니다.
rabbit.hide(); // 흰 토끼 이/가 숨었습니다!
클래스 Rabbit을 사용해 만든 객체는 rabbit.hide() 같은 Rabbit에 정의된 메서드에도 접근할 수 있고, rabbit.run() 같은 Animal에 정의된 메서드에도 접근할 수 있습니다.
function f(phrase) {
return class {
sayHi() { alert(phrase) }
}
}
class User extends f("Hello") {}
new User().sayHi(); // Hello
여기서 class User는 f("Hello")의 반환 값을 상속받습니다.</aside>
이 방법은 조건에 따라 다른 클래스를 상속받고 싶을 때 유용합니다. 조건에 따라 다른 클래스를 반환하는 함수를 만들고, 함수 호출 결과를 상속받게 하면 됩니다.
아래 예시처럼 extends 뒤에서 부모 클래스를 만들어주는 함수를 호출할 수 있죠.
<aside> 💡 extends 뒤에 표현식이 올 수도 있습니다.
엔진은 다음 절차를 따라 메서드 rabbit.run의 존재를 확인합니다(그림을 아래부터 보세요).
키워드 extends는 프로토타입을 기반으로 동작합니다. extends는 Rabbit.prototype.[[Prototype]]을 Animal.prototype으로 설정합니다. 그렇기 때문에 Rabbit.prototype에서 메서드를 찾지 못하면 Animal.prototype에서 메서드를 가져옵니다.
Animal을 상속받는 class Rabbit를 만들어 보겠습니다.
토끼는 동물이므로 Rabbit은 동물 관련 메서드가 담긴 Animal을 확장해서 만들어야 합니다. 이렇게 하면 토끼도 동물이 할 수 있는 ‘일반적인’ 동작을 수행할 수 있습니다.
this - JavaScript | MDN
JavaScript에서 함수의 this 키워드는 다른 언어와 조금 다르게 동작합니다. 또한 엄격 모드와 비엄격 모드에서도 일부 차이가 있습니다.
developer.mozilla.org
https://ko.javascript.info/function-prototype
함수의 prototype 프로퍼티
ko.javascript.info
| [FE 45] _23.05.16 _ Day 25 (JS_고차함수) (0) | 2023.05.16 |
|---|---|
| [FE 45] _23.05.15 _ Day 24 (JS_고차함수) (0) | 2023.05.15 |
| [FE 45] _23.05.11 _ Day 22 (JS_객체 지향 프로그래밍) (0) | 2023.05.11 |
| [코드스테이츠 FE 45기] _2023.05.10 _ Day 21 (JS_고차 함수) (0) | 2023.05.10 |
| [코드스테이츠 FE 45기] _2023.05.09 _ Day 20 (0) | 2023.05.09 |