본문 바로가기

모던 자바스크립트

4.5 'new' 연산자와 생성자 함수

📢 "new" 연산자와 생성자 함수를 사용하면 유사한 객체 여러 개를 쉽게 만들 수 있다. 

생성자 함수(constructor function)

재사용할 수 있는 객체 생성 코드를 구현한다.

📢 생성자 함수

◾️ 함수 이름의 첫 글자는 대문자로 시작한다.  

◾️ 반드시 'new' 연산자를 붙여 실행한다. 

 

◾️ new User() 함수의 실행 알고리즘

   1. 빈 객체를 만들어 this에 할당한다.

   2. 함수 본문을 실행한다.  this에 새로운 프로퍼티를 추가해 this를 수정한다.

   3. this를 반환한다. 

function User (name) {
  // 1. this = {};

  // 2. 새로운 프로퍼티를 this에 추가
  this.name = name;
  this.isAdmin = false;
  
  // 3. return this; 
}

let user = new User('suzu');

console.log(user.name); // suzu

◾️ 모든 함수는 생성자 함수가 될 수 있다. 

 

 

new function () {}

◾️ 재사용할 필요가 없는 복잡한 객체를 만들어야 할 때.

◾️ 코드를 익명 생성자 함수로 감싸준다. 

◾️ 익명 함수이기 때문에 어디에도 저장되지 않는다. 

◾️ 처음 만들 때부터 단 한번만 호출할 목적으로 만들었기 때문에 재사용이 불가하다. 

◾️ 익명 생성자 함수를 이용하면 재사용은 막으면서 코드를 캡슐화 할 수 있다. 

let user = new function() {
  this.name = 'suzu';
  this.isAdmin = false;
  
  // 복잡한 로직
}

 

new.target과 생성자 함수

* 자주 쓰이는 문법은 아님

 

◾️ new.target 프로퍼티를 사용하면 함수가 new와 함께 호출되었는지 알 수 있다. 

◾️ 일반적인 방법으로 호출(in regular mode) : undefined

◾️ new와 함께 호출(in constructor mode) : new.target 함수 자체를 반환

function User() {
  console.log(new.target);
}

User(); // undefined
new User(); // function User () {...}

 

◾️ 일반적인 방법으로 함수를 호출해도 new를 붙여 호출한 것과 같이 동작하게 하는 법

◾️ 유연하게 코드를 작성할 수 있지만 정말 필요한 경우에만 사용하는 것이 좋다. 

function User(name){
  if (!new.target){ // new 없이 호출해도
    return new User(name); // new를 붙여서 반환
  }
  
  this.name = name;
}

let suzu = User('suzu');
console.log(suzu.name); // suzu

 

생성자와 return문

◾️ 생성자 함수엔 보통 return문이 없다. 

◾️ 반환해야 할 것들은 모두 this에 저장되고, this는 자동으로 반환되기 때문에 명시적으로 써 줄 필요가 없다. 

◾️ return문이 있을 경우

    ◾️ 객체를 return  →  this 대신 객체를 반환

function User() {
  this.name = "suzu";
  
  return { name: 'ruru' }; // this가 아닌 객체를 반환
}

console.log(new User().name); // ruru

    ◾️ 원시형을 return  →  return문이 무시된다. 

function User() {
  this.name = "suzu";
  
  return; // this를 반환한다. 
}

console.log(new User().name); // suzu

 

 

괄호 생략하기

◾️ 인수가 없는 생성자 함수는 괄호를 생략해 호출할 수 있다. 

◾️ 그래도 괄호를 표시하는 것이 더 낫다. 

let user = new User();
let user = new User;

 

생성자 내 메서드

◾️ 생성자 함수를 사용하면 매개변수를 이용해 객체 내부를 자유롭게 구성할 수 있다. 

◾️ new User(name)은 프로퍼티 name과 메서드 sayHi를 가진 객체를 만들어 준다. 

function User(name) {
  this.name = name;
  
  this.sayHi = function() {
    console.log('My name is: ' + this.name);
  };
}

let suzu = new User('suzu');
suzu.sayHi(); // My name is suzu

 

 

📝 요약

◽️ 생성자함수(생성자) : 일반 함수이지만 일반 함수와 구분하기 위해 함수 이름 첫 글자를 대문자로 쓴다. 
◽️ 반드시 new연산자와 함께 호출해야한다. 
◽️ new와 함께 호출하면 내부에서 this가 암시적으로 만들어지고, 마지막엔 this가 반환된다. 
◽️ 유사한 객체를 여러 개 만들 때 생성자 함수가 유용하다.  
◽️ 자바스크립트에선 다양한 생성자 함수를 제공한다. (Date, Set ...)

 

아직 배울 게 많습니다!    ... 네.. 

 



📝 오늘 새롭게 배운 내용 📝

 

✅ 생성자 함수는 유사한 객체를 여러 개 만들 때 유용하다!!!

client에서 보내온 user의 정보들을 저장할 때 사용했었다. 

const user = new User(req.body);

 

✅ 생성자 함수안에는 보이지 않지만 열일하는 this가 존재한다. 

✅ 아직 배울게 많다...

 

 

 

📌 [JAVASCRIPT_INFO 'new'연산자와 생성자 함수]

 

'new' 연산자와 생성자 함수

 

ko.javascript.info

 

📌 [MDN new Operator]

 

new operator

new 연산자는 사용자 정의 객체 타입 또는 내장 객체 타입의 인스턴스를 생성한다.

developer.mozilla.org

 

 

 

 

 

 

'모던 자바스크립트' 카테고리의 다른 글

4.7 심볼형  (0) 2020.08.12
4.6 옵셔널 체이닝 '?.'  (0) 2020.08.11
4.4 메서드와 'this'  (0) 2020.08.08
4.3 가비지 컬렉션  (0) 2020.08.06
4.2 객체 - 참조에 의한 객체 복사  (0) 2020.08.05