시스템아 미안해
Chapter 4 - Item 39. 슈퍼클래스 속성 이름을 재사용하지 마라 본문
상속받은 클래스에서 부모와 동일한 속성 이름을 다시 정의하면
예기치 못한 버그나 유지보수 어려움이 생긴다.
프로토타입 체인과 인스턴스 속성의 동작 방식 때문에, 의도와 다르게 덮어쓰기가 발생한다.
function Animal(name) {
this.name = name;
}
function Dog(name, breed) {
Animal.call(this, name);
this.name = breed; // 부모의 name 필드를 덮어씀 (버그 가능성)
}
const d = new Dog("Max", "Beagle");
console.log(d.name); // Beagle — 원래 동물 이름 정보는 사라짐
같은 속성 이름을 쓰면 인스턴스의 필드가 부모 초기화 값을 그대로 덮어버린다.
ES6의 클래스 문법에서도 동일한 문제가 발생한다.
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.name = breed; // 부모에서 설정한 값 무효화
}
}
const d = new Dog("Max", "Beagle");
console.log(d.name); // "Beagle"
위 코드에선 super(name)에서 초기화한 부모의 값을 바로 아래 줄에서 덮었다.
이렇게 되면 부모 생성자가 내부적으로 이 필드를 사용하는 경우, 더 큰 버그로 이어질 수 있다.
! 권장사항
- 부모 클래스의 속성 이름을 그대로 쓰지 말고, 의미 있는 새로운 이름을 사용하자.
- 같은 개념이라도, 역할이 다르면 이름을 바꿔 충돌을 피한다.
'책 > Effective JavaScript' 카테고리의 다른 글
| Chapter 4 - Item 41. 프로토타입은 구현 세부사항으로 취급하라 (0) | 2025.08.11 |
|---|---|
| Chapter 4 - Item 40. 표준 클래스에서 상속받지 마라 (0) | 2025.08.11 |
| Chapter 4 - Item 38. 서브클래스 생성자에서 반드시 슈퍼클래스 생성자를 호출하라 (0) | 2025.08.10 |
| Chapter 4 - Item 37. this의 암묵적 바인딩을 이해하라 (0) | 2025.08.10 |
| Chapter 4 - Item 36. 인스턴스 상태는 반드시 인스턴스 객체에만 저장하라 (0) | 2025.08.10 |