October 25, 2021
엔진은 다음 절차를 따라 메서드 rabbit.run
의 존재를 확인합니다(그림을 아래부터 보세요).
rabbit
에 run
이 있나 확인합니다. run
이 없네요.rabbit
의 프로토타입인 Rabbit.prototype
에 메서드가 있나 확인합니다. hide
는 있는데 run
은 없습니다.extends
를 통해 관계가 만들어진 Rabbit.prototype
의 프로토타입, Animal.prototype
에 메서드가 있나 확인합니다. 드디어 메서드 run
을 찾았습니다.이제 한발 더 나아가 메서드를 오버라이딩 해봅시다. 특별한 사항이 없으면 class Rabbit
은 class Animal
에 있는 메서드를 ‘그대로’ 상속받습니다.
그런데 Rabbit
에서 stop()
등의 메서드를 자체적으로 정의하면, 상속받은 메서드가 아닌 자체 메서드가 사용됩니다.
class Rabbit extends Animal {
stop() {
// rabbit.stop()을 호출할 때
// Animal의 stop()이 아닌, 이 메서드가 사용됩니다.
}
}
개발을 하다 보면 부모 메서드 전체를 교체하지 않고, 부모 메서드를 토대로 일부 기능만 변경하고 싶을 때가 생깁니다. 부모 메서드의 기능을 확장하고 싶을 때도 있죠. 이럴 때 커스텀 메서드를 만들어 작업하게 되는데, 이미 커스텀 메서드를 만들었더라도 이 과정 전·후에 부모 메서드를 호출하고 싶을 때가 있습니다.
class Child extends Parent
Child.prototype.__proto__
가 Parent.prototype
이 되므로 메서드 전체가 상속됩니다.this
를 사용하기 전에 Child
생성자 안에서 super()
로 부모 생성자를 반드시 호출해야 합니다.Child
에 정의된 메서드에서 super.method()
를 사용해 Parent
에 정의된 메서드를 사용할 수 있습니다.[[HomeObject]]
에 자신이 정의된 클래스와 객체를 기억해놓습니다. super
는 [[HomeObject]]
를 사용해 부모 메서드를 찾습니다.super
가 있는 메서드는 객체 간 복사 시 제대로 동작하지 않을 수 있습니다.추가 사항:
this
나 super
를 갖지 않으므로 주변 컨텍스트에 잘 들어맞습니다.