πŸ“Œ 17μž₯ μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성

경이·2022λ…„ 3μ›” 8일
0


πŸ’— 17.1 Object μƒμ„±μž ν•¨μˆ˜

new μ—°μ‚°μžμ™€ ν•¨κ»˜ object μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 빈 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. 빈 객체λ₯Ό μƒμ„±ν•œ 이후 ν”„λ‘œνΌν‹° λ˜λŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ 객체λ₯Ό μ™„μ„±ν•  수 μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ μƒμ„±λœ 객체λ₯Ό μΈμŠ€ν„΄μŠ€(instance)라고 ν•œλ‹€.

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

  // ν”„λ‘œνΌν‹° μΆ”κ°€
  person.name = 'Lee';
  person.sayHello = function () {
    console.log('Hi! My name is ' + this.name);
  };

  console.log(person); // {name: "Lee", sayHello: Ζ’}
  person.sayHello(); // Hi! My name is Lee

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Object μƒμ„±μž ν•¨μˆ˜ 이외에도 String, Number, Boolean, Function, Array, Date, RegExp, Promise λ“±μ˜ 빌트이 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€.

πŸ’— 17.2 μƒμ„±μž ν•¨μˆ˜

17.2.1 객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ 문제점

객체 λ¦¬ν„°λŸ΄μ— μ˜ν•œ 객체 생성 방식은 단 ν•˜λ‚˜μ˜ 객체만 μƒμ„±ν•œλ‹€. λ”°λΌμ„œ λ™μΌν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό μ—¬λŸ¬ 개 생성해야 ν•˜λŠ” 경우 맀번 같은 ν”„λ‘œνΌν‹°λ₯Ό κΈ°μˆ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ μ΄λ‹€.

17.2.2 μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ°©μ‹μ˜ μž₯점

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 방식은 마치 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώ(클래슀)처럼 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œνΌν‹° ꡬ쑰가 λ™μΌν•œ 객체 μ—¬λŸ¬κ°œλ₯Ό κ°„νŽΈν•˜κ²Œ 생성할 수 μžˆλ‹€.

μƒμ„±μž ν•¨μˆ˜λŠ” 이름 κ·ΈλŒ€λ‘œ 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•ŸλŠ” ν•¨μˆ˜μ΄λ‹€. 일반 ν•¨μˆ˜μ™€ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•œλ‹€.

🧐 this

thisλŠ” 객체 μžμ‹ μ˜ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ 자기 μ°Έμ‘° λ³€μˆ˜λ‹€. thisκ°€ κ°€λ¦¬ν‚€λŠ” κ°’, 즉 this바인딩은 ν•¨μˆ˜ 호좜 방식에 따라 λ™μ μœΌλ‘œ κ²°μ •λœλ‹€.

17.2.3 μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ 생성과정

new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ‹€μŒκ³Ό 같은 과정을 거쳐 μ•”λ¬΅μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•œ ν›„ μ•”λ¬΅μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

  1. μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩
  2. μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”
  3. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

🧐 바인딩?

λ°”μΈλ”©μ΄λž€ μ‹λ³„μžμ™€ 값을 μ—°κ²°ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€. 예λ₯Όλ“€μ–΄, λ³€μˆ˜ 선언은 λ³€μˆ˜ 이름(μ‹λ³„μž)κ³Ό ν™•λ³΄λ˜ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œλ₯Ό 바인딩 ν•˜λŠ” 것이닀. this 바인딩은 this(ν‚€μ›Œλ“œλ‘œ λΆ„λ₯˜λ˜μ§€λ§Œ μ‹λ³„μž 역할을 ν•œλ‹€)와 thisκ°€ 가리킬 객체λ₯Ό λ°”μΈλ”©ν•˜λŠ” 것이닀.

17.2.4 λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]κ³Ό [[Construct]]

ν•¨μˆ˜λŠ” κ°μ²΄μ΄λ―€λ‘œ 일반 객체와 λ™μΌν•˜κ²Œ λ™μž‘ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 일반 κ°μ²΄μ™€λŠ” λ‹€λ₯΄λ‹€. 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€. ν•¨μˆ˜ κ°μ²΄λŠ” [[Environment]], [[FormalParameters]] λ“±μ˜ λ‚΄λΆ€ 슬둯과, [[Call]]κ³Ό [[Construct]]같은 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€λ‘œ 가지고 있기 λ•Œλ¬Έμ΄λ‹€.

  function foo() {}

  // 일반적인 ν•¨μˆ˜λ‘œμ„œ 호좜: [[Call]]이 ν˜ΈμΆœλœλ‹€.
  foo();

  // μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜: [[Construct]]κ°€ ν˜ΈμΆœλœλ‹€.
  new foo();

λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]을 κ°–λŠ” ν•¨μˆ˜ 객체λ₯Ό callable이라고 ν•˜λ©°, λ‚΄λΆ€ λ©”μ„œλ“œ[[Construct]]λ₯Ό κ°–λŠ” ν•¨μˆ˜ 객체λ₯Ό constructor, [[Construct]]λ₯Ό 갖지 μ•ŠλŠ” ν•¨μˆ˜ 객체λ₯Ό non-constructor라고 λΆ€λ₯Έλ‹€.

결둠적으둜 ν•¨μˆ˜ κ°μ²΄λŠ” callableμ΄λ©΄μ„œ constructorμ΄κ±°λ‚˜ callableμ΄λ©΄μ„œ non-constructorλ‹€. 즉 λͺ¨λ“  ν•¨μˆ˜ κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μžˆμ§€λ§Œ λͺ¨λ“  ν•¨μˆ˜ 객체λ₯Ό μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλŠ”κ²ƒμ€ μ•„λ‹ˆλ‹€.

17.2.5 constructor와 non-constructor의 ꡬ뢄

  • constructor : ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹, 클래슀
  • non-constructor : λ©”μ„œλ“œ, ν™”μ‚΄ν‘œ ν•¨μˆ˜

ECMAScript μ‚¬μ–‘μ—μ„œ λ©”μ„œλ“œλž€ ES6 λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„λ§Œμ„ μ˜λ―Έν•œλ‹€. λ‹€μ‹œ 말해 ν•¨μˆ˜κ°€ 어디에 ν• λ‹Ήλ˜μ–΄ μžˆλŠ”μ§€μ— 따라 λ©”μ„œλ“œμΈμ§€λ₯Ό νŒλ‹¨ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•¨μˆ˜ μ •μ˜ 방식에 따라 constructorκ³Ό non-constructorλ₯Ό κ΅¬λΆ„ν•œλ‹€.

17.2.6 new μ—°μ‚°μž

new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ [[Call]]이 ν˜ΈμΆœλ˜λŠ” 것이 μ•„λ‹ˆλΌ [[Construct]]κ°€ ν˜ΈμΆœλœλ‹€.

일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ— νŠΉλ³„ν•œ ν˜•μ‹μ  μ°¨μ΄λŠ” μ—†κΈ° λ•Œλ¬Έμ—, μƒμ„±μž ν•¨μˆ˜λŠ” 일반적으둜 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ κΈ°μˆ ν•˜λŠ” 파슀칼 μΌ€μ΄μŠ€λ‘œ λͺ…λͺ…ν•˜μ—¬ 일반 ν•¨μˆ˜μ™€ ꡬ별할 수 μžˆλ„λ‘ ν•œλ‹€.

17.2.7 new.target

new.target은 this 와 μœ μ‚¬ν•˜κ²Œ constructor인 λͺ¨λ“  ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 암묡적인 지역 λ³€μˆ˜μ™€ 같이 μ‚¬μš©λ˜λ©° 메타 ν”„λ‘œνΌν‹°λΌκ³  λΆ€λ₯Έλ‹€. ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ new.target을 μ‚¬μš©ν•˜λ©΄ new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜되면 ν•¨μˆ˜ λ‚΄λΆ€μ˜ new.target은 ν•¨μˆ˜ μžμ‹ μ„ 가리킨닀. new μ—°μ‚°μž 없이 일반 ν•¨μˆ˜λ‘œμ„œ 호좜된 ν•¨μˆ˜ λ‚΄λΆ€μ˜ new.target은 undefinedλ‹€.

  // μƒμ„±μž ν•¨μˆ˜
  function Circle(radius) {
    // 이 ν•¨μˆ˜κ°€ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ§€ μ•Šμ•˜λ‹€λ©΄ new.target은 undefinedλ‹€.
    if (!new.target) {
      // new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό μž¬κ·€ ν˜ΈμΆœν•˜μ—¬ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.
      return new Circle(radius);
    }

    this.radius = radius;
    this.getDiameter = function () {
      return 2 * this.radius;
    };
  }

  // new μ—°μ‚°μž 없이 μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬λ„ new.target을 톡해 μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλœλ‹€.
  const circle = Circle(5);
  console.log(circle.getDiameter());
profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보