17장. 생성자 함수에 의한 객체 생성

Happhee·2021년 12월 6일
0

JS : Depp Dive

목록 보기
14/35
post-thumbnail

1. Object 생성자 함수

new 연산자와 함께 Object 생성자 함수를 호출 -> 빈 객체를 생성하여 반환

const person = new Object();
const person2 = { }
  • 생성자 함수 (constructor)
    new 연산자와 함께 호출하여 객체(인스턴스)를 생성하는 함수
// String 생성자 함수에 의한 String 객체 생성
const strObj = new String('Lee');
console.log(typeof strObj); // object
console.log(strObj);        // String {"Lee"}

// Number 생성자 함수에 의한 Number 객체 생성
const numObj = new Number(123);
console.log(typeof numObj); // object
console.log(numObj);        // Number {123}

// Boolean 생성자 함수에 의한 Boolean 객체 생성
const boolObj= new Boolean(true);
console.log(typeof boolObj); // object
console.log(boolObj);        // Boolean {true}

// Function 생성자 함수에 의한 Function 객체(함수) 생성
const func = new Function('x', 'return x * x');
console.log(typeof func); // function
console.dir(func);        // ƒ anonymous(x)

// Array 생성자 함수에 의한 Array 객체(배열) 생성
const arr = new Array(1, 2, 3);
console.log(typeof arr); // object
console.log(arr);        // [1, 2, 3]

// RegExp 생성자 함수에 의한 RegExp 객체(정규 표현식) 생성
const regExp = new RegExp(/ab+c/i);
console.log(typeof regExp); // object
console.log(regExp);        // /ab+c/i

// Date 생성자 함수에 의한 Date 객체 생성
const date = new Date();
console.log(typeof date); // object
console.log(date);        // Mon May 04 2020 08:36:33 GMT+0900 (대한민국 표준시)

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

  • built-in 생성자 함수
    String, Boolean, Number, Function, Array, Date, RegExp, Promise

2. 생성자 함수

객체 리터럴에 의한 객체 생성 방식의 문제점
1. 단 하나의 객체만 생성해야 함
2. 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우 매번 같은 프로퍼티를 기술해야 하기에 상당히 비효율적

  • 객체 : 프로퍼티를 통해 객체 고유의 상태 (state)를 표현
    메서드를 통해 상태 데이터인 프로퍼티를 참조하고 조작하는 동작을 표현

  • 생성자 함수를 사용하면 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성가능!

//생성자 함수
function Circle(radius) {
    //인스턴스 초기화
    this.radius = radius;
    this.getDiameter = function () {
        return 2 * this.radius;
    };
}
//인스턴스 생성
const c1 = new Circle(4);
const c2 = new Circle(8);

console.log(c1.getDiameter());
console.log(c2.getDiameter());
  • 인스턴스 생성 과정
    인스터스를 초기화 (프로퍼티 추가 및 초기값 할당) -> 생성은 필수! 초기화는 옵션!
    new 연산자와 함께 생성자 함수를 호출하면, 자바스크립트 엔진은 암묵적으로 인스턴스를 초기화 한 후,인스턴스를 반환
function Circle(radius) {
  // 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.

  // 2. this에 바인딩되어 있는 인스턴스를 초기화한다.
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };

  // 3. 암묵적으로 this를 반환한다.
  // 명시적으로 객체를 반환하면 암묵적인 this 반환이 무시된다.
  return {};
}

// 인스턴스 생성. Circle 생성자 함수는 명시적으로 반환한 객체를 반환한다.
const circle = new Circle(1);
console.log(circle); // {}
  1. binding : 식별자와 값을 연결하는 과정
  2. 인스턴스 초기화
  3. 인스턴스 반환
  • 함수로서 동작하기 위해 함수 객체만을 위한 [[Environment]], [[FormalParameters]], [[Call]], [[Construct]]같은 내부 메서드를 추가로 가짐
function foo() {}

// 일반적인 함수로서 호출: [[Call]]이 호출된다.
foo();

// 생성자 함수로서 호출: [[Construct]]가 호출된다.
new foo();
  • constructor : 함수 선언문, 함수 표현식, 클래스(클래스도 함수)
  • non-constructor : 메서드 , 화살표 함수

new 연산자가 있으면, 생성자 함수로 동작 없으면, 일반 함수로 호출
new 연산자와 함께 생성자 함수로서 호출되면 함수 내부의 new.target은 함수 자신을 말한다
만약, new연산자가 없이 일반함수로서 호출되면 undefined이다

profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글