생성자 함수

2022. 5. 14. 12:28·JavaScript
728x90
반응형

생성자 함수

-> new 연산자와 함께 호출하여 객체(인스턴스)를 생성하는 함수를 말함

-> 생성자 함수에 의해 생성된 객체를 인스턴스라고 한다.

 

Object 생성자 함수 , 다양한 빌트인 생성자 함수(String ~ Data, Promise)

const person=new Object();

person.name='Hi'
person.age=11

console.log(person);

{ name: 'Hi', age: 11 }

const strObj=new String('hi')

console.log(typeof(strObj))
console.log(strObj);

const numObj=new Number(10)

console.log(numObj);

object
[String: 'hi']
[Number: 10]

직관적이고 간편한 생성 방식, 하지만 여러개의 객체를 생성할 때 비효율적

 

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

 

생성자 함수

인스턴스 생성

인스턴스 초기화( 옵션 ) -> 엔진에 의해 암묵전인 처리 (인스턴스 생성후 반환)

 

아래 코드처럼 생성자 함수내  this를 찍어보면 빈 객체가 나오는것을 확인할수있다.

이 빈 객체가 생성자 함수가 생성한 인스턴스고 인스턴스는 this에 바인딩된다.

바인딩은 말 그대로 식별자와 값을 연결하는 과정이다.

인스턴스를 초기화 할때 this에 바인딩되어있는 인스턴스를 초기화 하는것이다.

this에 바인딩 되어있는 인스턴스는 개발자가 다룬다.

생성자 함수 내부의 모든 처리가 끝나면 바인딩된 this가 암묵적으로 반환된다.

 

네이밍규칙은 파스칼 케이스(대문자)

new만 붙여주면 생성자함수가 될수있기 때문에 네이밍 규칙이 존재

function Square(r){
  console.log(this) // Square()
  this.r=r,
  this.getSide=()=>{
    return this.r*this.r
  }
}

const sq1=new Square(5);
const sq2=new Square(10);


console.log(sq1.getSide())
console.log(sq2.getSide());


25
100

new가 없을시
일반 함수로 호출
const sq1=Square(10);
console.log(sq1) // undefined
이때 this는 전역 객체를 가리킨다.
console.log(r) // 10

만약 괄호를 빼면?
console.log(sq1.getSide);

[Function (anonymous)]

생성자 함수내부에 return문은 생략하라

명시적으로 다른 객체를 반환하면 this는 반환되지 않는다

원시값으로 반환시 무시하고 this가 반환된다.

function Square(r){
  console.log(this);
  this.r=r,
  this.getSide=()=>{
    return this.r*this.r
  }
  return {}
}
-----------------------------------
function Square(r){
  console.log(this);
  this.r=r,
  this.getSide=()=>{
    return this.r*this.r
  }
  return 10
}

this

this는 객체 자신의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수다.

함수 호출 방식 this가 가리키는 값(this 바인딩)
일반 함수로서 호출 전역 객체
메서드로서 호출 메서드를 호출한 객체
생성자 함수로서 호출 생성자 함수가 생성할 인스턴스

 

내부 메서드 [[Call]],[[Contruct]]

함수는 객체라는 것을 알고 있을 것이다. 하지만 일반 객체와 달리 함수는 호출이 가능하다.

함수는 객체면서 호출가능한 특징을 가지기 위해 추가된 내부 메서드를 가진다

[[Call]] - 함수 객체 callable 호출가능 함수

[[Contruct]] - 함수 객체 constructor 생성자 함수

-모든 함수는 callable이지만 constructor은 아님-

constructor를 가지고 있을수 있는 함수는 일반함수, 함수 선언문과 함수 표현식으로 정의된 함수다.

 

[생성자 함수가 new 연산자 없이 호출 되는 경우 방지]

new.target

constructor인 모든 함수 내부에 암묵적인 지역 변수와 같이 사용 -> 메타 프로퍼티

function Pow(a){
Pow 함수가 new 연산자와 같이 호출X -> new.target은 undefined로 나오기에 아래 if문으로 undefined일때
생성자 함수로 만들어서 return 시킴
  if(!new.target){ 
    return new Pow(a)
  }
  this.a=a;
  this.getValue=()=>{
    return this.a*this.a
  }
}

const pow=Pow(10) 내부에 설정을 해줬기에 new없이도 생성자 함수로 작동함
console.log(pow.getValue()); 100출력

스코프 세이프 생성자 

if(!(this instanceof Pow)){
    return new Pow(a)
  }

instanceof는 생성자의 prototype 속성이 객체 prototype 체인 어딘가 존재하는지 판별하는 연산자

-> bool값으로 나옴

Pow함수는 this에 바인딩되어서 프로토타입 체인을 생성하고 instanceof로 확인해서 있으면 true 없으면 false

 

728x90
반응형
저작자표시 (새창열림)

'JavaScript' 카테고리의 다른 글

strict mode / 빌트인 객체  (0) 2022.05.24
함수와 일급 객체  (1) 2022.05.14
스코프 / 프로퍼티 어트리뷰트  (1) 2022.05.14
함수  (2) 2022.05.09
객체  (0) 2022.05.04
'JavaScript' 카테고리의 다른 글
  • strict mode / 빌트인 객체
  • 함수와 일급 객체
  • 스코프 / 프로퍼티 어트리뷰트
  • 함수
Hun-bot
Hun-bot
IT를 중심으로 다양한 것
  • Hun-bot
    로봇이 만드는 눈사람
    Hun-bot
  • 전체
    오늘
    어제
    • All Article (128)
      • Programmers (6)
        • TIP (1)
        • SQL (2)
        • LV1 (1)
        • LV2 (2)
        • LV3 (0)
      • Baekjoon (31)
        • Bronze (10)
        • Silver (19)
        • Gold (2)
        • Platinum (0)
        • Diamond (0)
      • Leetcode (0)
        • Easy (0)
        • Medium (0)
        • Hard (0)
        • SQL (0)
      • 알고리즘(Algorithm) (42)
      • JavaScript (40)
      • Linux (7)
      • JSP (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      JS #JavaScript #프로그래머스 #알고리즘
      리눅스
      BaekJoon
      고득점 Kit
      LeetCode #JS #Javascript #Algorithm
      알고리즘 #Algorithm
      JS #JavaScript #프로그래머스 #카카오
      JS #프로그래머스 #숫자의표현 #알고리즘
      알고리즘
      JSP #Vscode #톰켓 #Tomcat #Java #Web #jdk
      자바스크립트
      티스토리챌린지
      JS #javascript #객체 #Object
      c++
      Python #알고리즘
      JS #정규표현식
      SQL
      Vue #Vue.js #정리
      Javascript
      자바스크립트 #연습문제
      백준
      JavaScript #Set #Collection
      JS #클래스
      Algorithm
      오블완
      프로그래머스
      프로그래머스 #자바스크립트 #JS
      리눅스 #입문
      async await #js #문법 #자바스크립트 #비동기
      Programmers
    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    Hun-bot
    생성자 함수
    상단으로

    티스토리툴바

    티스토리툴바