[study] 언제까지 넘겨 짚을래 ch17. 생성자 함수에 의한 객체 생성

가오리·2023년 4월 27일
0

javascript

목록 보기
15/44
post-thumbnail
📌 스터디 교재 및 강의
  1. [youtube] 모던 자바스크립트 Deep Dive 스터디
  2. [e-book] 모던 자바스크립트 Deep Dive
  3. [e-book] 코어 자바스크립트
  4. [blog] 자바스크립트 개발자라면 알아야 할 33가지 개념

✏️ Object 생성자 함수

🪝 생성자 함수(constructor) : new 연산자와 함께 호출하여 객체를 생성하는 함수

🪝 인스턴스(instance) : 생성자 함수에 의해 생성된 객체

new 연산자와 함께 Object 생성자 함수를 호출하면 빈 객체를 생성하여 반환한다. 빈 객체를 생성한 이후 프로퍼티 또는 메서드를 추가하여 객체를 완성할 수 있고 특별한 이유가 없다면 객체 ㄹ리터럴을 사용하는 것이 더 간편하고 유용하다.

// 빈 객체 생성
const animal = new Object();

// 프로퍼티 추가
animal.name = 'gaori';
animal.sayHi = function () {
  console.log(`Hi, ${this.name}`);
};
console.log(animal); // { name: 'gaori', sayHi: f }
animal.sayHi(); // Hi, gaori

// 기타 생성자 함수
const strObj = new String('coco');
const numObj = new Number(5);
const booObj = new Boolean(true);
const arrObj = new Array(1, 2, 3);
// 빈 객체 생성
const animal = new Object();

// 프로퍼티 추가
animal.name = 'gaori';
animal.sayHi = function () {
  console.log(`Hi, ${this.name}`);
};
console.log(animal); // { name: 'gaori', sayHi: f }
animal.sayHi(); // Hi, gaori

// 기타 생성자 함수
const strObj = new String('coco');
const numObj = new Number(5);
const booObj = new Boolean(true);
const arrObj = new Array(1, 2, 3);

✏️ 생성자 함수

  1. 객체 리터럴에 의한 객체 생성 방식의 문제점

    객체 리터럴에 의한 객체 생성 방식은 직관적이고 간편하지만 단 하나만의 객체만 생성하다보니 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우 비효율적이다.

  2. 생성자 함수에 의한 객체 생성 방식의 장점

    객체를 생성하기 위한 템플릿처럼 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성할 수 있다. 일반 함수와 동일한 방법으로 생성자 함수를 정의하고 new 연산자와 함께 호출하면 생성자 함수로 동작한다.

  3. 생성자 함수의 인스턴스 생성 과정

    1. 인스턴스 생성과 this 바인딩
    2. 인스턴스 초기화
    3. 인스턴스 반환
  4. 내부 메서드 [[Call]][[Construct]]

    함수는 객체이지만 일반 객체와 다르다.

    🪝 함수 객체 구조

    • 일반 객체가 가진 내부 슬롯, 내부 메서드
    • 함수 객체만을 위한 내부슬롯([[Environment]], [[FormalParameters]])과 내부 메서드([[Call]], [[Construct]])
    • callable : 내부 메서드 [[Call]] 을 갖는 함수 객체
    • constructor : 내부 메서드 [[Construct]]를 갖는 함수 객체
    • non-constructor : 내부 메서드 [[Construct]]를 갖지 않는 함수 객체
    function sayHi() {
      console.log('Hi');
    }
    
    // 일반 함수
    sayHi();
    
    // 생성자 함수
    new sayHi();
  5. constructor와 non-constructor의 구분

    함수 객체를 생성할 때 함수 저으이 방식에 따라 함수를 constructor, non-constructor로 구분한다.

    • constructor : 함수 선언문, 함수 표현식, 클래스
    • non-constructor : 메서드, 화살표 함수
  6. new 연산자

    일반 함수와 생성자 함수에 특별한 형식적 차이는 없기 때문에 생성자 함수는 일반적으로 첫 문자를 대문자로 기술하고 new 연산자 없이 생성자 ㅎ마수를 호출하면 일반 함수로 호출된다.

  7. new.target

    생성자 함수는 new 연산자 없이 호출되는 것을 방지하기 위해 new.target을 사용한다. new 연산자와 함께 생성자 함수로 호추로디면 함수 내부의 new.target은 함수 자신을 가리키고 일반 함수로 호출된 함수 내부의 new.targetundefined다.

profile
가오리의 코딩일기

0개의 댓글