Constructor Function

생성자 함수

객체를 리터럴을 이용하여 생성하면 직관적이고 간편하다.
그러나 객체 리터럴에 의한 객체 생성 방식은 단 하나의 객체만을 생성한다.
따라서 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우, 매번 같은 프로퍼티를 기술해야하는 비효율이 발생한다.

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

생성자 함수에 의한 객체 생성은 객체를 생성하기 위한 템플릿처럼 생성자 함수를 이용하여 동일한 프로퍼티 구조의 객체를 간편하게 여러 개 생성할 수 있다.

생성자 함수는 특별한 형식이 정해진 것이 아니라 일반 함수와 동일한 방법으로 함수를 정의하고 new 연산자를 함께 호출하면 생성자 함수로 동작한다.

만약 생성자 함수를 호출하지 않으면 생성자 함수가 아니라 일반 함수로 동작한다.

내부 메소드 [[Call]], [[Construcor]]

함수 선언문 또는 함수 표현식으로 정의한 함수는 일반적인 함수로 호출할 수도 있고 생성자 함수로 호출할 수도 있다.

생성자 함수로 호출한다는 것은 new 연산자와 함께 호출하여 객체를 생성한다는 것이다.

내부 메소드 [[Call]]이 구현되어 있는 객체를 callable이라 하고, 내부 메소드인 [[Constructor]]가 구현되어 잇는 객체를 constructor, 구현되어 있지 않은 객체를 non-costructor라고 부른다.

callable은 호출할 수 있다는 것으로 함수를 말한다.

constructor는 생성자 함수로서 호출할 수 있는 객체를 의미한다.

함수가 일반 함수로 호출되면 내부 메소드 [[Call]]이 호출되는 것이고 new 연산자(또는 super)와 함께 생성자 함수로서 호출된다면 내부 메소드 [[Constructor]]가 호출된다.

호출 할 수 없는 객체는 함수 객체가 아니므로 모든 함수 객체는 반드시 callable이어야 한다.
따라서 모든 함수 객체는 [[Call]]이 구현되어 있어 호출 할 수 있다.

하지만 모든 함수 객체가 [[Constructor]]를 구현하지는 않는다.
즉 함수 객체는 constructor일 수도 있고 non-constructor일 수도 있다.

모든 함수 객체는 호출 할 수 있지만 생성자 함수로서 호출할 수 있는 것은 아니다.

constructor와 non-constructor

일반 함수로 정의된 함수만이 constructor이다.
함수의 종류가 Arrow, Method인 함수는 non-constructor가 된다.

함수가 일반적인 함수로서 호출되면 함수 객체의 내부 메소드 [[Call]]가 호출되고 new 연산자 또는 super 연산자와 함께 생성자 함수로서 호출되면 내부 메소드 [[Constructor]]가 호출된다.

ES6의 메소드 축약 표현만을 메소드 정의로 인정한다.

생성자 함수의 동작 방식

생성자 함수의 역할은 프로퍼티 구조가 동일한 인스턴스를 생성하기 위한 템플릿(클래스)으로서 동작하여 인스턴스를 생성하는 것과 생성된 인스턴스의 프로퍼티 값을 초기화하는 것이다.

빈 객체 생성과 this 바인딩 생성자 함수 내부의 코드가 실행되기 전에 먼저 빈 객체가 암묵적으로 생성된다. 그리고 생성된 빈 객체는 this에 바인딩된다.

생성된 빈 객체를 가리키는 this를 사용하여 프로퍼티나 메소드를 추가한다. 그리고 프로퍼티에 인수로 전달받은 초기값을 할당하여 초기화하거나 고정값을 할당한다. 이 처리는 개발자가 기술한다.

생성자 함수 내부의 모든 처리가 끝나면 암묵적으로 this를 반환한다.
만약 명시적으로 return문을 구현하면 this가 아닌 명시적으로 표현한 객체가 반환된다.

생성자 함수 내부에서 명시적으로 this가 아닌 다른 값을 반환하는 것은 생성자 함수의 기본 동작을 훼손한다. 따라서 생성자 함수 내부에서 return 문을 반드시 생략해야 한다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×