λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λ…μ„œ λͺ©λ‘/λͺ¨λ”₯λ‹€ Modern JS Deep Dive

[λͺ¨λ”₯λ‹€] 17μž₯ μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성

728x90

-> μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식을 μ•Œμ•„λ³Έλ‹€.

 

 

🌻 17.1 Object μƒμ„±μž ν•¨μˆ˜

 

new μ—°μ‚°μžμ™€ ν•¨κ»˜ Obj μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 빈 객체λ₯Ό 생성, λ°˜ν™˜ν•œλ‹€.

이후에 ν”„λ‘œνΌν‹°, λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ„œ 객체λ₯Ό μ™„μ„±ν•  수 μžˆλ‹€.

 

μƒμ„±μž ν•¨μˆ˜

: new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•΄ 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜.

μΈμŠ€ν„΄μŠ€

: μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ μƒμ„±λœ 객체

 

const person = new Object();

person.name = 'Lee';
person.sayHello = function () { console.log("Hello" + this.name) };

 

 

JS λŠ” Object μƒμ„±μž ν•¨μˆ˜ 외에 String, Number, ... λ“±λ“± 의 빌트인 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€.

 

 

 

 

 

🌻 17.2 μƒμ„±μž ν•¨μˆ˜

 

 

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

 

객체 λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•˜λŠ” 방식은 직관적, κ°„νŽΈν•˜μ§€λ§Œ, 

단 ν•˜λ‚˜μ˜ 객체만 생성함. 

-> λ™μΌν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό μ—¬λŸ¬κ°œ μƒμ„±ν•˜λŠ” 경우 λΉ„νš¨μœ¨μ 

 

 

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

 

μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄, 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦Ώ(클래슀)처럼 

ν”„λ‘œνΌν‹° ꡬ쑰가 λ™μΌν•œ 객체λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“€ 수 μžˆλ‹€.

 

function Animal(name) {
    this.name = name;
    this.eating = function () {
        console.log(this.name + 'is eating')
    }
}

const dog = new Animal('dog');
const cat = new Animal('cat');

 

 

πŸ“Œ this

: ν•¨μˆ˜ 호좜 방식에 따라 λ™μ μœΌλ‘œ 결정됨.

- 일반 ν•¨μˆ˜λ‘œμ„œ : μ „μ—­ 객체

- λ©”μ„œλ“œλ‘œμ„œ : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체

- μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ : μƒμ„±μž ν•¨μˆ˜κ°€ (λ―Έλž˜μ—) 생성할 μΈμŠ€ν„΄μŠ€

 

μƒμ„±μž ν•¨μˆ˜ : 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜

 

일반 ν•¨μˆ˜μ²˜λŸΌ function 을 μ΄μš©ν•΄ μ •μ˜,

new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ν•¨. 

 

 

 

17.2.3 μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

 

μƒμ„±μž ν•¨μˆ˜μ˜ μ—­ν•  :

ν”„λ‘œνΌν‹°κ°€ λ™μΌν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦ΏμœΌλ‘œ λ™μž‘

=> μΈμŠ€ν„΄μŠ€λ₯Ό 생성 (ν•„μˆ˜)

=> μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™” (μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° μΆ”κ°€ 및 μ΄ˆκΈ°κ°’ ν• λ‹Ή) (μ˜΅μ…˜)

 

this 둜 ν”„λ‘œνΌν‹° μΆ”κ°€ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜μ§€λ§Œ, μƒμ„±ν•˜κ³  λ°˜ν™˜ν•˜λŠ” μ½”λ“œκ°€ μ—†μŒ. 

=> JS 엔진이 암묡적인 처리λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έ. 

 

 

πŸ“Œ 암묡적인 처리 κ³Όμ •

 

1. μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩 (μ‹λ³„μžμ™€ 값을 μ—°κ²°)

- μ•”λ¬΅μ μœΌλ‘œ 빈 객체 생성

- ν•¨μˆ˜ λͺΈμ²΄μ˜ μ½”λ“œκ°€ ν•œ 쀄 μ”© μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„ 이전에 싀행됨. 

 

2. μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”

- this 에 λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”

- this에 바인딩 λ˜μ–΄μžˆλŠ” μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œ μΆ”κ°€

- μƒμ„±μž ν•¨μˆ˜κ°€ 인수둜 전달받은 μ΄ˆκΈ°κ°’μ„ ν• λ‹Ή 

(κ°œλ°œμžκ°€ κΈ°μˆ ν•œ λŒ€λ‘œ)

 

3. μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ 바인딩 된 this λ₯Ό μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.

Circle {radius: 1, getDiameter: f}

 

return

- λ‹€λ₯Έ 객체 λͺ…μ‹œμ  λ°˜ν™˜ : this λŒ€μ‹  λͺ…μ‹œν•œ 객체 λ°˜ν™˜

- λ‹€λ₯Έ μ›μ‹œκ°’ λͺ…μ‹œμ  λ°˜ν™˜ : λ¬΄μ‹œλ˜κ³  this κ°€ λ°˜ν™˜

 

 

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

 

ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜ -> 일반적 ν•¨μˆ˜ ν˜Ήμ€ μƒμ„±μž ν•¨μˆ˜ λ‘˜ λ‹€ 될 수 있음.

μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•œλ‹€λŠ” 것: new μ—°μ‚°μžμ™€ ν•¨κ»˜ 호좜 & 객체λ₯Ό μƒμ„±ν•˜λŠ” 것을 의미

 

ν•¨μˆ˜λŠ” 객체

-> 일반 객체와 λ™μΌν•˜κ²Œ λ™μž‘

 

일반 객체와 ν•¨μˆ˜κ°€ λ‹€λ₯Έ 점

일반 객체 : ν˜ΈμΆœν•  수 μ—†μŒ. 

ν•¨μˆ˜ : 일반 객체가 가진 λ‚΄λΆ€ 슬둯, λ‚΄λΆ€ λ©”μ„œλ“œ + ν•¨μˆ˜λ‘œμ„œ λ™μž‘ν•˜κΈ° μœ„ν•œ λ‚΄λΆ€ 슬둯, λ©”μ„œλ“œλ„ 가지고 있음.

 

callable : λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]] 을 κ°–λŠ” ν•¨μˆ˜ 객체 :: 호좜 κ°€λŠ₯ν•œ 일반 ν•¨μˆ˜

constructor : λ‚΄λΆ€ λ©”μ„œλ“œ [[Construct]] λ₯Ό κ°–λŠ” ν•¨μˆ˜ 객체 :: μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜

non-constructor : 암것도 μ—†λŠ” μ•  :: μƒμ„±μž ν•¨μˆ˜λ‘œ 호좜 ν•  수 μ—†λŠ” ν•¨μˆ˜

 

호좜 ν•  수 μ—†λŠ” ν•¨μˆ˜ : ν•¨μˆ˜ 객체가 μ•„λ‹˜. -> ν•¨μˆ˜ κ°μ²΄λŠ” λ°˜λ“œμ‹œ callable

λͺ¨λ“  ν•¨μˆ˜ 객체 : λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]] 을 κ°–κ³  있음. ν•˜μ§€λ§Œ [[Construct]] λ₯Ό κ°–λŠ” 건 μ•„λ‹˜. 

 

 

 

17.2.5 construct 와 non-constructor 의 ꡬ뢄

 

πŸ“Œ ν•¨μˆ˜ μ •μ˜ 방식에 따라 ꡬ뢄

constructor

- ν•¨μˆ˜ μ„ μ–Έλ¬Έ, ν•¨μˆ˜ ν‘œν˜„μ‹, 클래슀

non-constructor 

- λ©”μ„œλ“œ(ES6 λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„), ν™”μ‚΄ν‘œ ν•¨μˆ˜

 

μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹Œ 일반 ν•¨μˆ˜(callable && construct) 에 new μ—°μ‚°μžλ₯Ό 뢙이면 μƒμ„±μž ν•¨μˆ˜μ²˜λŸΌ λ™μž‘ν•  μˆ˜λ„ μžˆμœΌλ‹ˆ 주의.

 

 

17.2.6 new μ—°μ‚°μž

 

일반 ν•¨μˆ˜ vs μƒμ„±μž ν•¨μˆ˜ -> ν˜•μ‹μ μΈ 차이 μ—†μŒ.

단, new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λŠ” constructor μ—¬μ•Ό 함. 

λ°˜λŒ€λ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό new 없이 ν˜ΈμΆœν•˜λ©΄ 일반 ν•¨μˆ˜λ‘œ 호좜됨. 

 

 

17.2.7 new.target

 

μƒμ„±μž ν•¨μˆ˜κ°€ new μ—°μ‚°μž 없이 ν˜ΈμΆœλ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ ES6μ—μ„œ μ‚¬μš©. 

this 와 μœ μ‚¬.

 

- constructor 인 λͺ¨λ“  ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 암묡적인 μ§€μ—­λ³€μˆ˜μ™€ 같이 μ‚¬μš©λ¨. 

- 메타 ν”„λ‘œνΌν‹°λΌκ³  뢀름. 

 

new.target : 

new μ—°μ‚°μžμ™€ ν•¨κ»˜ 호좜 -> ν•¨μˆ˜ μžμ‹ μ„ 가리킴

new μ—†μœΌλ©΄ -> undefined

 

πŸ“Œ μŠ€μ½”ν”„ 세이프 μƒμ„±μž νŒ¨ν„΄

new.target μ‚¬μš©ν•  수 μ—†λŠ” μƒν™©μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” νŒ¨ν„΄

(new 와 ν•¨κ»˜ 호좜됐으면 -> new Circle λ°˜ν™˜ν•˜λŠ” 방식)

 

728x90
λ°˜μ‘ν˜•