JavaScript에서 객체를 생성하는 대표적인 방법은 두 가지입니다. 하나는 new Object() 표기법이고, 다른 하나는 객체 리터럴({}) 표기법입니다. 기본적으로 이 두 방식은 같은 작업을 수행합니다. 바로 새로운 객체를 초기화하는 것이죠.
하지만 객체에 속성(property)을 추가하기 시작하면 두 방식 사이에 미묘한 차이가 나타날 수 있습니다. 아래 예제를 통해 확인해 보겠습니다.
객체 리터럴을 사용한 초기화
let a = {
name: 'Ayush'
}위 코드는 다음과 동일하게 동작합니다.
let a = new Object(); a.name = 'Ayush';
또는 다음과 같이 빈 객체를 먼저 만든 뒤 속성을 추가할 수도 있습니다.
let a = {};
a.name = 'Ayush';상속 클래스에서는 상황이 다릅니다
그러나 상속된(inherited) 클래스에서는 이야기가 달라집니다. 이런 클래스들은 자체적으로 정의한 커스텀 생성자(constructor)를 가질 수 있으며, 그 결과 new ClassName() 호출이 위에서 설명한 일반적인 초기화 흐름과 다르게 동작하도록 만들 수 있습니다.
즉, 생성자 내부에서 어떤 로직을 실행하고 어떤 값을 반환할지는 전적으로 개발자(프로그래머)의 재량에 달려 있다는 것입니다.
참고: 객체 리터럴이 선호되는 이유
실무에서는 대부분 객체 리터럴({}) 방식을 권장합니다. 코드가 더 간결하고 가독성이 좋으며, 전역 스코프의 Object가 다른 값으로 덮어써졌을 때 발생할 수 있는 잠재적 문제도 피할 수 있기 때문입니다.