용어
•
인스턴스(instance): 생성자함수에 의해 만들어진 객체
•
this: 객체 자신의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수
•
생성자 함수(constructor): 객체(인스턴스)를 생성하는 함수(일종의 템플릿)
•
바인딩(binding): 식별자와 값을 연결하는 과정
객체 리터럴에 의한 객체 생성 방식의 문제점
단 하나의 프로퍼티만을 생성하므로, 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야하는 경우
반복해서 같은 프로퍼티를 기술해야하므로 비효율적
→ 생성자 함수로 객체를 생성해 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성 가능
일반 함수처럼 정의하고,
함수 표현식으로 변수에 할당할 때, new 연산자와 함께 해당 함수를 호출하면 생성자 함수로 사용 가능
생성자 함수의 인스턴스 생성 과정
1.
인스턴스 생성과 this 바인딩
암묵적으로 빈 객체({}, 인스턴스) 생성 → this와 해당 인스턴스 바인딩(런타임 이전에 실행)
2.
인스턴스 초기화
코드가 실행되면서 this에 바인딩 되어있는 인스턴스를 초기화
3.
인스턴스 반환
(return될 값을 명시적으로 기술하지 않았을 시) 생성자함수는 암묵적으로 this를 반환
단, 원시값을 반환할 시 원시값은 무시되고 this가 반환됨
다른 값을 반환하는 것은 생성자 함수의 기본 동작을 훼손하므로, 생성자 함수 내부에서 return문은 반드시 생략해야 함
17.2.4 내부 메서드 [[Call]]과 [[Constructor]]
callable: 호출 할 수 있는 객체(= 함수), 내부메서드 [[Call]]을 갖는 함수 객체
constructor: 생성자 함수로써 호출할 수 있는 함수, 내부메서드 [[Constructor]]를 갖는 함수 객체
non-constructor: 객체를 생성자 함수로써 호출할 수 없는 함수
모든 함수는 callable이고, constructor와 non-construtor로 나뉨
(모든 함수는 호출할 수 있지만, 모든 함수가 생성자 함수는 아님)
17.2.5 constructor, non-constructor 구분
일반함수(함수 선언문, 함수 표현식)로 정의된 함수만이 constructor이고,
화살표 함수, 메서드 축약 표현으로 정의된 함수는 non-constructor
17.2.6 new 연산자
new 연산자와 함께 함수를 호출하면 내부 메서드 [[Construct]] 호출
new 연산자 없이 함수를 호출하면 내부 메서드 [[Call]] 호출
일반함수의 this는 전역객체 window를 가리킴
생성자 함수는 파스칼 케이스 사용(단어의 첫글자가 대문자)
17.2.7 new.target
new 연산자와 함께 호출된 함수 내부의 new.target은 자기자신을 가리킴
new 연산자 없이 호출된 함수 내부의 new.target은 undefined
(new.target을 지원하지 않는 IE에서는 대안으로 스코프 세이프 생성자 패턴 사용 가능)
Object와 Function 생성자 함수는 new 연산자와 함께 호출했을 때, 없이 호출했을 때 결과가 같음
String, Number, Boolean은 new 연산자 없이 호출했을 때,
각각 string, number, boolean 타입으로 반환하기때문에 데이터타입변환 용도로 사용하기도 함