Oops, All Code!/📝 Study Notes
[JS] constructor와 non-constructor의 구분
밍동망동
2023. 3. 9. 00:00
[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 연산자를 붙이면 생성자 함수처럼 동작할 수 있다.