자바스크립트에서의 생성자 함수에 의한 객체 생성
Object 생성자 함수
const person = new Object();
new 연산자와 함께 호출하여 객체를 생성하는 함수를 말한다. 생성자 함수에 의해 생성된 객체를 인스턴스라 한다. new 연산자
와 함께 호출하면 해당 함수는 생성자 함수
로 동작한다. 만약 new 연산자와 함께 생성자 함수를 호출하지 않으면 일반 함수
로 동작한다.
생성자 함수의 역할은 프로퍼티 구조가 동일한 인스턴스를 생성하기 위한 템플릿으로서 동작하여 인스턴스
를 생성하는 것과 초기화
하는 것이다. 생성자 함수가 인스턴스를 생성하는 것은 필수이고, 생성된 인스턴스를 초기화하는 것은 옵션이다.
function Circle(radius){
// 1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다.
// 2. this에 바인딩되어 있는 인스턴스를 초기화한다.
// 3. 암묵적으로 this를 반환한다.
this.radius = radius;
this.getDiameter = function(){
return 2*this.radius;
};
const circle1 = new Circle(5);
}
자바스크립트 엔진은 암묵적인 처리를 통해 인스턴스를 생성하고 반환한다. new 연산자를 사용하여 생성자 함수를 호출하면 암묵적으로 아래의 과정들을 거친다.
인스턴스 생성과 this 바인딩 암묵적으로 빈 객체가 생성되고 이 빈 객체에 인스턴스는 this에 바인딩된다. 이러한 처리는 런타임 이전에 실행된다.
인스턴스 초기화 생성자 함수에 기술되어 있는 코드가 한 줄씩 실행되어 this에 바인딩되어 있는 인스턴스를 초기화한다. this에 바인딩되어 있는 인스턴스에 프로퍼티나 메서드를 추가하고 생성자 함수가 인수로 전달받은 초기값을 인스턴스 프로퍼티에 할당하여 초기화하거나 고정값을 할당한다. 이 부분은 개발자가 기술한다.
인스턴스 반환 생성자 함수 내부의 모든 처리가 끝나면 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.
this
this는 객체 자신의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수이다.
- 일반 함수로서 호출 - 전역 객체
- 메서드로서 호출 - 메서드를 호출한 객체
- 생성자 함수로서 호출 - 생성자 함수가 생성할 인스턴스
바인딩
식별자와 값을 연결하는 과정을 의미한다.
함수는 객체
함수는 객체이므로 일반 객체와 동일하게 동작할 수 있으며 일반 객체는 호출할 수 없지만 함수는 호출
할 수 있다. 여기서는 간단하게만 다룰 예정이지만 조금더 심화를 원하시면 non-constructor, callable, constructor
을 검색해보는 것을 추천한다.
함수 객체는 함수로써 호출을 할 수 있어야 하지만, 모든 함수 객체를 생성자 함수로서 호출할 수 있는 것은 아니다정도만 알아두면 될 것 같다.
자바스크립트 엔진은 어떤 방식으로 위의 생성자 함수로서 구분하는지 간단하게 설명하자면, 함수 객체를 생성할 때 함수 정의 방식
에 따라 구분한다. 함수 선언문과 함수 표현식으로 정의된 함수
는 생성자 함수이고, ES6의 화살표 함수와 메서드 축약 표현
으로 정의된 함수는 생성자 함수라고 구분하지 않는다.