시스템아 미안해

Chapter 4 - Item 33. 생성자를 new에 의존하지 않게 만들기 본문

책/Effective JavaScript

Chapter 4 - Item 33. 생성자를 new에 의존하지 않게 만들기

if else 2025. 8. 10. 19:27

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를 설계한다면, 이 패턴이 필수적이다.