자바스크립트에서의 생성자 함수에 의한 객체 생성

Javascript

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 연산자를 사용하여 생성자 함수를 호출하면 암묵적으로 아래의 과정들을 거친다.

  1. 인스턴스 생성과 this 바인딩 암묵적으로 빈 객체가 생성되고 이 빈 객체에 인스턴스는 this에 바인딩된다. 이러한 처리는 런타임 이전에 실행된다.

  2. 인스턴스 초기화 생성자 함수에 기술되어 있는 코드가 한 줄씩 실행되어 this에 바인딩되어 있는 인스턴스를 초기화한다. this에 바인딩되어 있는 인스턴스에 프로퍼티나 메서드를 추가하고 생성자 함수가 인수로 전달받은 초기값을 인스턴스 프로퍼티에 할당하여 초기화하거나 고정값을 할당한다. 이 부분은 개발자가 기술한다.

  3. 인스턴스 반환 생성자 함수 내부의 모든 처리가 끝나면 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.

this

this는 객체 자신의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수이다.

바인딩

식별자와 값을 연결하는 과정을 의미한다.

함수는 객체

함수는 객체이므로 일반 객체와 동일하게 동작할 수 있으며 일반 객체는 호출할 수 없지만 함수는 호출할 수 있다. 여기서는 간단하게만 다룰 예정이지만 조금더 심화를 원하시면 non-constructor, callable, constructor을 검색해보는 것을 추천한다.

함수 객체는 함수로써 호출을 할 수 있어야 하지만, 모든 함수 객체를 생성자 함수로서 호출할 수 있는 것은 아니다정도만 알아두면 될 것 같다.

자바스크립트 엔진은 어떤 방식으로 위의 생성자 함수로서 구분하는지 간단하게 설명하자면, 함수 객체를 생성할 때 함수 정의 방식에 따라 구분한다. 함수 선언문과 함수 표현식으로 정의된 함수는 생성자 함수이고, ES6의 화살표 함수와 메서드 축약 표현으로 정의된 함수는 생성자 함수라고 구분하지 않는다.