생성자 함수
- 객체 리터럴에 의한 객체 생성 방식의 문제점
- 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우 같은 프로퍼티를 기술해야 하기 때문에 비효율적이다.
- 생성자 함수에 의한 객체 생성 방식의 장점
- 객체(인스턴스)를 생성하기 위한 템플릿(클래스)처럼 생성자 함수를 사용하여 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성할 수 있다.
function Circle(radius){ this.radius = radius; this.getDiameter = function () { return this.radius*2; } } const circle1 = new Cicle(5); cosnt circle2 = new Circle(10)
- 생성자 함수의 인스턴스 생성 과정
- 인스턴스 생성과 this 바인딩
- 암묵적으로 빈 객체를 생성, 빈 객체를 this에 바인딩 한다.
- 인스턴스 초기화 (프로퍼티 생성 및 재할당)
- 생성자 함수에 기술되어 있는 코드가 한 줄씩 실행되어 this에 바인딩되어 있는 인스턴스를 초기화 한다
- 인스턴스 반환만약 this가 아닌 다른 객체를 명시적으로 반환 한다면 명시한 객체가 반환된다. 객체가 아닌 원시 값을 반환하면 무시하고 this를 반환한다.
- this가 암묵적으로 반환된다
내부 메서드 [[Call]]과 [[Construct]]
- 함수는 객체이므로 일반 객체와 동일하게 동작
- 일반 객체와 차이점은 함수 객체를 위한 내부 슬롯 [[Environment]], [[FormalParameters]], 내부메서드 [[Call]], [[Construct]]를 추가로 가지고 있다.
- 일반 함수로 호출되면 [[Call]], 생성자 함수로 호출되면 [[Construct]]가 호출된다.
- 모든 함수는 [[Call]]을 갖는 Callable이지만, 모든 함수가 [[Construct]]를 가진 Constructor객체는 아니다.
- Constructor와 non-Constructor의 구분
- constructor : 함수 선언문, 함수 표현식, 클래스(클래스도 함수)
- non-constructor : 메서드(ES6 메서드 축약 표현), 화살표 함수
const baz = { x : function () {} } //프로퍼티 x는 constructor. const baz = { x () {} } //메서드 x는 non-constructor
new 연산자
- new 연산자는 Constructor 함수이어야 한다.
- new.target
- 생성자 함수가 new 연산자 없이 호출되는 것을 방지하기 위해 파스칼 케이스 컨벤션으로 명명하여 일반 함수와 구분할 수 있게 노력해야 한다.
- new.target은 생성자 함수로서 호출되면 함수 자신을 가리키고, 일반함수로 호출되면 undefined를 값으로 가진다.
// Scope-Safe Constructor Pattern 스코프 세이프 생성자 패턴 function Circle (radius){ if(!(this instanceof Circle)){ return new Circle(radius) } this.radius = radius; this.getDiameter = function () { return this.radius*2; } } //new 연산자 없이도 생성자 함수로서 호출된다.
'기술 서적 > 하루 30분 모딥다' 카테고리의 다른 글
하루 30분 모던 자바스크립트 딥 다이브 프로토타입1 (0) | 2023.06.22 |
---|---|
하루 30분 모던 자바스크립트 딥 다이브. 함수와 일급 객체 (0) | 2023.06.21 |
하루 30분 모던 자바스크립트 딥 다이브. 프로퍼티 어트리뷰트 (0) | 2023.06.19 |
하루 30분 모던 자바스크립트 딥 다이브. let, const 키워드 (0) | 2023.06.16 |
하루 30분 모던 자바스크립트 딥 다이브. 전역 변수의 문제 (0) | 2023.06.14 |