시스템아 미안해
Chapter 4 - Item 33. 생성자를 new에 의존하지 않게 만들기 본문
JavaScript의 생성자 함수는 new 키워드를 붙여 호출해야 의도대로 동작한다.
new 없이 호출하면 this가 전역 객체(브라우저: window)를 가리키거나, undefined로 되어 에러를 발생시킨다.
function Person(name) {
this.name = name;
}
const p1 = new Person("Alice"); // 정상
const p2 = Person("Bob"); // 잘못된 사용 — 전역에 name 생성됨
실수 방지를 위해, 생성자 함수 내부에서 new 없이 호출된 경우를 감지하고 자동으로 new를 붙여주도록 해야 한다.
function Person(name) {
if (!(this instanceof Person)) {
return new Person(name);
}
this.name = name;
}
이렇게 하면 new를 빠뜨려도 안전하게 동작한다.
ES6이후 class 문법이 도입되면서, 클래스 생성자는 반드시 new로만 호출 가능하다.
new 없이 호출하면 TypeError가 발생하므로 위와 같은 방어 코드가 필요 없다.
class Person {
constructor(name) {
this.name = name;
}
}
new Person("Alice"); // OK
Person("Bob"); // TypeError: Class constructor Person cannot be invoked without 'new'
즉, ES6 이후에는 class를 쓰면 new 유무에 대한 방어 로직이 필요 없다.
- ES6 이상 환경이라면 class 문법 사용이 안전하고 가독성도 좋다.
- 구형 환경(ES5)이나 함수 기반 생성자를 유지해야 한다면, instanceof 검사로 new 유무를 감지하고 방어 코드 작성.
- 라이브러리나 유틸리티 함수에서 “생성자처럼도, 일반 함수처럼도” 호출될 수 있는 API를 설계한다면, 이 패턴이 필수적이다.
'책 > Effective JavaScript' 카테고리의 다른 글
| Chapter 4 - Item 35. private 데이터를 저장할땐 클로저를 사용하라 (0) | 2025.08.10 |
|---|---|
| Chapter 4 - Item 34. 메서드는 프로토타입에 저장하라 (2) | 2025.08.10 |
| Chapter 4 - Item 32. __proto__를 절대 수정하지 말라 (2) | 2025.08.10 |
| Chapter 4 - Item 31. Object.getPrototypeOf를 __proto__ 대신 사용하라 (0) | 2025.08.10 |
| Chapter 4 - Item 30. prototype, getPrototypeOf, __proto__ 차이를 이해하라 (1) | 2025.08.10 |