티스토리 뷰

 

[JS] 내부 메서드 [[Call]]과 [[Construnct]]

함수는 객체이므로 일반 객체와 동일하게 동작한다. 즉, 함수 객체는 내부 슬롯과 내부 메서드를 모두 가지고 있다. 일반 객체와 다른 점은 함수는 호출할 수 있다는 부분이다. function test() {} test

404minda.tistory.com

 

함수 정의 방식에 따라 함수를 constructor와 non-constructor로 구분한다.

 

constructor 함수 선언문, 함수 표현식, 클래스
non-constructor 메서드, 화살표 함수

 

1. constructor

 

// 함수 선언문
function test() {}

// 함수 표현식
const foo = function() {};

// 메서드로 인정하지 않는 함수
const bar = {
  a: function() {}
};

new test();
new foo();
new bar.a();

 

constructor와 non-consturctor의 구분 법은 정의 방식이다.

함수의 할당 위치가 아닌 정의 방식에 따라 구분된다.

 

함수 선언문과 함수 표현식만이 constructor로 생성자함수로 사용할 수 있다.

 

 

2. non-constructor

주의할 점은 ECMAScript가 메서드로 인정하는 범위가 좁다는 것이다.

ES6에서는 메서드 축약 표현만을 메서드로 인정한다.

 

화살표 함수와 메서드 축약 표현은 non-constructor이며, 이 경우 [[Construct]]를 갖지 않는다.

// 화살표 함수
const arrow = () => {};

// 메서드(축약 표현)
const test = {
  a() {}
}
new arrow(); // TypeError
new test.a(); // TypeError

따라서 non-constructor인 함수 객체를 생성자함수로 호출하면 에러가 발생한다.

 

3. 주의

위와 같은 성질로 인해 일반 함수를 기대하고 정의한 함수일지라도

new 연산자를 붙이면 생성자 함수처럼 동작할 수 있다.

 

댓글