EnJinnier

JS Deep Dive - 17. 생성자 함수에 의한 객체 생성 본문

스터디/모던 자바스크립트 Deep Dive

JS Deep Dive - 17. 생성자 함수에 의한 객체 생성

공학도진니 2024. 5. 2. 16:27

가장 기본적으로 간단하게 객체를 생성하는 방식은 10장에서 배웠던 객체 리터럴에 의한 객체 생성 방식이다.

이외 다양한 객체 생성 방식 중 생성자 함수를 사용하여 객체를 생성하는 방식을 살펴보자.

 

17.1 Object 생성자 함수

new 연산자와함께 Object 생성자 함수를 호출하면 빈 객체(인스턴스)를 생성하여 반환.

빈 객체를 생성한 이후 프로퍼티 또는 메서드를 추가하여 객체를 완성할 수 있음.

자바스크립트는 Object 생성자 함수 이외에도 String, Number, Boolean, Function, Array, Date, RegExp, Promise 등의 빌트인생성자 함수를 제공한다.

 

17.2.1 객체 리터럴에 의한 객체 생성 방식

장점: 직관적이고 간편

단점 : 단 하나의 객체만 생성하므로 동일한 프로퍼티를 갖는 객체를 여러개 생성해야 하는 경우 매번 같은 프로퍼티를 기술해야 하기 때문에 비효율적.

 (getDiameter 메서드가 완전히 동일함에도 불구하고 매번 같은 메서드를 다시 기술하고 있음)

17.2.2 생성자 함수에 의한 객체 생성 방식

장점: 마치 객체(인스턴스)를 생성하기 위한 템플릿(클래스)처럼 생성자 함수를 사용하여 프로퍼티 구조가 동일한 객체 여러개를 간편하게 생성할 수 있음.

일반 함수와 동일한 방법으로 생성자 함수를 정의하고 new 연산자와 함께 호출하면 해당 함수는 생성자 함수로 동작한다.

 

17.2.4 내부 메서드 [[Call]]과 [[Construct]]

함수가 일반 함수로서 호출되면 함수 객체의 내부메서드[[Call]]이 호출되고

new 연산자와 함께 생성자 함수로서 호출되면 내부 메서드 [[Construct]]가 호출된다.

 

내부메서드[[Call]]을 갖는 함수 객체를 callable이라 하며, 내부메서드[[Construct]]를 갖는 함수 객체를 constructor, [[Construct]]를 갖지 않는 함수 객체를 non-constructor라고 부른다. 

=> callable은 호출할 수 있는 객체, 즉 함수를 말하며, constructor는 생성자 함수로서 호출할수 있는 함수, non-constructor는 객체를 생성자 함수로서 호출할 수 없는 함수를 의미함.

(non-constructor인 함수 객체를 생성자 함수로서 호출하면 에러 발생)

 

17.2.5 constructor와 non-constructor의 구분

자바스크립트 엔진은 함수 정의를 평가하여 함수 객체를 생성할 때 함수 정의 방식에 따라 함수를 constructor와 non- constructor로 구분한다.