javascript

constructor 와 non-constructor

노엠디엔 2023. 4. 23. 13:28

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

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

함수는 객체이므로 일반 객체와 동일하게 동작할 수 있다.

함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드를 모두 가지고 있기 때문이다.

 

함수 = 객체

함수는 객체이지만 일반 객체와는 다르다. 일반 객체는 호출 할 수 없지만 함수는 호출할 수 있다.

함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드는 물론 함수로서 동작하기 위해 함수 개체만을 위한
[[Eviorment]]. [[FormalParameters]] 등의 내부 슬롯과 [[Call]], [[Construct]] 같은 내부 메서드를 추가로 가지고 있다.

 

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

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

 

내부 메서드 [[Call]]을 갖는 함수 객체를 callable이라 하며,

내부 메서드 [[Construct]]를 갖는 함수 객체를 constructor

[[Construct]]를 갖지 않는 함수를 객체를 non-constructorf라고 부른다.

callable은 호출 할 수 있는 객체, 즉 함수를 말하며

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

호출할 수 없는 객체는 함수 객체가 아니므로 함수로서 가능하는 객체, 즉 함수 객체는 반드시 callable이어야 한다.

따라서 모든 함수 객체는 내부메서드 [[Call]]을 갖고 있으므로 호출할 수 있다.

함수 객체는 constructor일 수도 있고 non-constructor일 수도 있다.

 

 

 

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

  • constructor : 함수 선언문, 함수 표현식, 클래스 (클래스도 함수이다.)
  • non-constructor : 메서드의 축약 표현, 화살표 함수

함수를 프로퍼티 값으로 사용하면 일반적으로 메서드로 통칭한다.

하지만 ECMAScript 사양에서 메서드란ES6의 메서드 축약 표현만을 의미한다. 

따라서 함수 선언문과 함수 표현식으로 정의된 함수가 constructor이고

ES6의 화살표 함수와 메서드 축약 표현으로 정의된 함수는 non-constructor

 

 

생성자 함수로서 호출될 것을 기대하고 정의하지 않은 일반함수 (Callable 이면서 constructor에

new연산자를 붙여 호출하면 생성자 함수처럼 동작할 수 있다.

 

이번 글을 통해서 함수가 객체라는 명확한 이유에 대해서 알 수 있었다.

함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드를 모두 가지고 있고

일반 함수로서 호출되면 함수 객체의 내부 메서드 [[Call]]이 호출되고
new 연산자와 함께 생성자 함수로서 호출되면 내부 메서드[[Construct]]가 호출된다.

함수 객체는 내부메서드 [[Call]]을 갖고 있어서 일반 객체와는 다르게 호출할 수 있는 것이였다.

함수 정의 방식에 따라 constructor와 non-constructor로 구분하며.

constructor 에는  함수 선언문 과 함수 표현식, 클래스도 함수라는 것과

화살표 함수는 non-constructor라는 것

함수를 프로퍼티 값으로 사용하면 일반적으로 메서드로 통칭하며 

객체의 프로퍼티값의 일반 함수를 정의된 것은 메서드로 인정되지 않는다는 것에 대해 알았다.

 

 

책:Modern Deep Dive Javascript

 

 

'javascript' 카테고리의 다른 글

ES6 추가 기능  (0) 2023.05.31
new 연산자  (0) 2023.04.23
생성자 함수  (0) 2023.04.20
순수함수  (0) 2023.03.01
require와 import  (1) 2023.02.27