JavaScript는 프로토타입 기반이므로, 어떤 생성자 함수(또는 클래스)에서 정의된 메서드를 재정의하려면 해당 객체의 프로토타입에 접근해 동일한 이름으로 메서드를 다시 정의할 수 있다.
function Person(name) {
this.name = name;
}
// 프로토타입 메서드 정의
Person.prototype.greet = function () {
console.log(`Hello, I'm ${this.name}`);
};
const alice = new Person("Alice");
alice.greet(); // "Hello, I'm Alice"
// 프로토타입 메서드 오버라이드
Person.prototype.greet = function () {
console.log(`Hi, my name is ${this.name}!`);
};
const bob = new Person("Bob");
bob.greet(); // "Hi, my name is Bob!"
alice.greet(); // "Hi, my name is Alice!"
ECMAScript 2015(ES6)부터 JavaScript에 클래스 문법이 추가되었으며, ES6 클래스는 프로토타입을 좀 더 직관적으로 사용할 수 있게 해준다. 클래스 상속 시, 부모 클래스(슈퍼클래스)의 메서드를 자식 클래스(서브클래스)에서 동일한 메서드 이름으로 다시 정의하면 사실상 오버라이드가 일어난다.
class Animal {
speak() {
console.log("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
// 메서드 오버라이드
speak() {
console.log("강아지가 멍멍 짖습니다.");
}
}
const dog = new Dog();
dog.speak(); // "강아지가 멍멍 짖습니다."
@Override
혹은 override
같은 키워드는 없지만, 부모 클래스의 메서드와 동일한 이름으로 메서드를 선언함으로써 오버라이드가 이루어진다.super.speak()
같이 super
키워드를 통해 접근할 수 있다.