🀍 은지log 🀍

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성 λ³Έλ¬Έ

πŸ’œ λͺ¨λ˜Javascript

μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ 객체 생성

Eun_zii 2022. 9. 28. 14:23

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

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

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

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

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

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

객체 λ¦¬ν„°λŸ΄μ— μ˜ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” 경우 ν”„λ‘œνΌν‹° ꡬ쑰가 동일함에도 λΆˆκ΅¬ν•˜κ³  맀번 같은 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κΈ°μˆ ν•΄μ•Ό ν•œλ‹€. 객체가 ν•œλ‘ 개라면 λ„˜μ–΄κ°ˆμˆ˜λ„ μžˆλ””λ§Œ λ§Œμ•½ μˆ˜μ‹­κ°œμ˜ 객체λ₯Ό 생성해야 ν•œλ‹€λ©΄ λ¬Έμ œκ°€ 크닀.

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

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

 

πŸ“ thisλŠ” 객체 μžμ‹ μ˜ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ 자기 μ°Έμ‘° λ³€μˆ˜λ‹€. thisκ°€ κ°€λ¦¬ν‚€λŠ” κ°’, this 바인딩은 ν•¨μˆ˜ 호좜 방식에 따라 λ™μ μœΌλ‘œ κ²°μ •λœλ‹€.
일반 ν•¨μˆ˜λ‘œμ„œ 호좜      ➑   μ „μ—­ 객체
λ©”μ„œλ“œλ‘œμ„œ 호좜          ➑   λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체 ( λ§ˆμΉ¨ν‘œ μ•žμ˜ 객체 )
μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜   βž‘  μƒμ„±μž ν•¨μˆ˜κ°€ ( λ―Έλž˜μ— ) 생성할 μΈμŠ€ν„΄μŠ€

 

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

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

μƒμ„±μž ν•¨μˆ˜μ˜ 역할은 ν”„λ‘œνΌν‹° ꡬ쑰가 λ™μΌν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν…œν”Œλ¦ΏμœΌλ‘œμ„œ λ™μž‘ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ”κ²ƒμ™€ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”(μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° μΆ”κ°€ 및 μ΄ˆκΈ°κ°’ ν• λ‹Ή)ν•˜λŠ” 것이닀. μƒμ„±μž ν•¨μˆ˜κ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것은 ν•„μˆ˜ 이고, μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 것은 μ˜΅μ…˜μ΄λ‹€.

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

1. μΈμŠ€ν„΄μŠ€ 생성과 this 바인딩

μ•”λ¬΅μ μœΌλ‘œ 빈 객체가 μƒμ„±λœλ‹€. 이 빈 객체가 μƒμ„±μž 함ꡬ가 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ‹€. 그리고 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ 빈 객체, 즉 μΈμŠ€ν„΄μŠ€λŠ” this에 λ°”μΈλ”©λœλ‹€. μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ˜ thisκ°€ μƒμ„±μž ν•¨μˆ˜κ°€ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ΄μœ κ°€ λ°”λ‘œ 이것이닀. 이 μ²˜λ¦¬λŠ” ν•¨μˆ˜ λͺΈμ²΄μ˜ μ½”λ“œκ°€ ν•œ 쀄씩 μ‹€ν–‰λ˜λŠ” λŸ°νƒ€μž„ 이전에 μ‹€ν–‰λœλ‹€.

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

μƒμ„±μž ν•¨μˆ˜μ— κΈ°μˆ λ˜μ–΄ μžˆλŠ” μ½”λ“œκ°€ ν•œ 쀄씩 μ‹€ν–‰λ˜μ–΄ this에 바인딩 λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™” ν•œλ‹€. this에 바인딩 λ˜μ–΄ μžˆλŠ” μΈμŠ€ν„΄μŠ€μ— ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜κ³  μƒμ„±μž ν•¨μˆ˜κ°€ 인수둜 전달받은 μ΄ˆκΈ°κ°’μ„ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•˜μ—¬ μ΄ˆκΈ°ν™” ν•˜κ±°λ‚˜ 고정값을 ν• λ‹Ή ν•œλ‹€.

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

μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ˜ λͺ¨λ“  μ²˜λ¦¬κ°€ λλ‚˜λ©΄ μ™„μ„±λœ μΈμŠ€ν„΄μŠ€κ°€ λ°”μΈλ”©λœ thisκ°€ μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜λœλ‹€.
λ§Œμ•½ thisκ°€ μ•„λ‹Œ λ‹€λ₯Έ 객체λ₯Ό λͺ…μ‹œμ μœΌλ‘œ λ°˜ν™˜ν•˜λ©΄ thisκ°€ λ°˜ν™˜λ˜μ§€ λͺ»ν•˜κ³  return 문에 λͺ…μ‹œν•œ 객체가 λ°˜ν™˜λœλ‹€. ν•˜μ§€λ§Œ λͺ…μ‹œμ μœΌλ‘œ μ›μ‹œκ°’μ„ λ°˜ν™˜ν•˜λ©΄ μ›μ‹œκ°’ λ°˜ν™˜μ€ λ¬΄μ‹œλ˜κ³  μ•”λ¬΅μ μœΌλ‘œ thisκ°€ λ°˜ν™˜λœλ‹€.
이처럼 μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λͺ…μ‹œμ μœΌλ‘œ thisκ°€ μ•„λ‹Œ λ‹€λ₯Έ 값을 λ°˜ν™˜ν•˜λŠ” 것은 μƒμ„±μž ν•¨μˆ˜μ˜ κΈ°λ³Έ λ™μž‘μ„ ν›Όμ†ν•œλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ return문을 λ°˜λ“œμ‹œ μƒλž΅ν•΄μ•Ό ν•œλ‹€.

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

ν•¨μˆ˜ κ°μ²΄λŠ” 일반 객체가 가지고 μžˆλŠ” λ‚΄λΆ€μŠ¬λ‘―κ³Ό λ‚΄λΆ€ λ©”μ„œλ“œλŠ” λ¬Όλ‘ , ν•¨μˆ˜λ‘œμ„œ λ™μž‘ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ κ°μ²΄λ§Œμ„ μœ„ν•œ

[[ Environment ]], [[ FormalParameters ]] λ“±μ˜ λ‚΄λΆ€ 슬둯과 [[ Call ]], [[Construct]] 같은 λ‚΄λΆ€ λ©”μ„œλ“œλ₯Ό μΆ”κ°€λ‘œ 가지고 μžˆλ‹€.

 

ν•¨μˆ˜κ°€ 일반 ν•¨μˆ˜λ‘œμ„œ 호좜되면 ν•¨μˆ˜ 객체의 λ‚΄λΆ€ λ©”μ„œλ“œ [[Call]]이 호좜되고 newμ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜되면 [[ Construct ]]κ°€ ν˜ΈμΆœλœλ‹€.

Constructor κ³Ό non-constructor의 ꡬ뢄

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ μ •μ˜λ₯Ό ν‰κ°€ν•˜μ—¬ ν•¨μˆ˜ 객체λ₯Ό 생성할 λ•Œ ν•¨μˆ˜ μ •μ˜ 방식에 따라 ν•¨μˆ˜λ₯Ό Constructor κ³Ό non-constructor둜 κ΅¬λΆ„ν•œλ‹€.

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

new μ—°μ‚°μž

일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ— νŠΉλ³„ν•œ ν˜•μ‹μ  μ°¨μ΄λŠ” μ—†λ‹€.

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

ν•¨μˆ˜ 객체 의 λ‚΄λΆ€ λ©”μ„œλ“œ [[ Call ]]이 ν˜ΈμΆœλ˜λŠ” 것이 μ•„λ‹ˆλΌ [[ Construct ]]κ°€ ν˜ΈμΆœλœλ‹€.

단, new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λŠ” non-constructor이 μ•„λ‹Œ Constructor 이어야 ν•œλ‹€.일반 ν•¨μˆ˜μ™€ μƒμ„±μž ν•¨μˆ˜μ— νŠΉλ³„ν•œ ν˜•μ‹μ  μ°¨μ΄λŠ” μ—†μ§€λ§Œ μƒμ„±μž ν•¨μˆ˜λŠ” 일반적으둜 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ 기술 ( 파슀칼 μΌ€μ΄μŠ€ ) ν•˜μ—¬ 일반 ν•¨μˆ˜μ™€ κ΅¬λ³„ν• μˆ˜ μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€.

new.target

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

new μ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜되면 ν•¨μˆ˜ λ‚΄λΆ€μ˜ new.target은 ν•¨μˆ˜ μžμ‹ μ„ 가리킨닀. new μ—°μ‚°μžμ—†μ΄ 일반 ν•¨μˆ˜λ‘œμ„œ 호좜된 λ‚΄λΆ€μ˜ new.target은 undefined이닀.
λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ new.target을 μ‚¬μš©ν•˜μ—¬ new μ—°μ‚°μžμ™€ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν–ˆλŠ”μ§€ ν™•μΈν•˜μ—¬ 그렇지 μ•ŠμœΌλ©΄ new μ—°μ‚°μžμ™€ ν•¨κ»˜ μž¬κ·€ ν˜ΈμΆœμ„ 톡해 μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν• μˆ˜ μžˆλ‹€.

 

πŸ“ μŠ€μ½”ν”„ 세이프 μƒμ„±μž νŒ¨ν„΄
new.target은 ES6μ—μ„œ λ„μž…λœ μ΅œμ‹  λ¬Έλ²•μœΌλ‘œ IEμ—μ„œλŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. new.target을 μ‚¬μš©ν•  수 μ—†λŠ” 상황이라면 μŠ€μ½”ν”„ 세이프 μƒμ„±μž νŒ¨ν„΄μ„ μ‚¬μš©ν• μˆ˜ μžˆλ‹€.

 

newμ—°μ‚°μžμ™€ ν•¨κ»˜ μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ μƒμ„±λœ κ°μ²΄λŠ” ν”„λ‘œν†  νƒ€μž…μ— μ˜ν•΄ μƒμ„±μž ν•¨μˆ˜μ™€ μ—°κ²°λœλ‹€. 이λ₯Ό μ΄μš©ν•΄ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

λŒ€λΆ€λΆ„μ˜ 빌트인 μƒμ„±μž ν•¨μˆ˜ ( Object, String, Number, Boolean, Function, Array, Date, RegExp, Promise λ“± )λŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•œ ν›„ μ μ ˆν•œ 값을 λ°˜ν™˜ ν•œλ‹€.
예λ₯Ό λ“€μ–΄, Object 와 Function μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μž 없이 ν˜ΈμΆœν•΄λ„ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν–ˆμ„ λ•Œμ™€ λ™μΌν•˜κ²Œ λ™μž‘ν•œλ‹€.

ν•˜μ§€λ§Œ String, Number, Boolean μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν–ˆμ„λ•Œ String, Number, Boolean 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜μ§€λ§Œ new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λ©΄ λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ 값을 λ°˜ν™˜ν•œλ‹€. 이λ₯Ό 톡해 데이터 νƒ€μž…μ„ λ³€ν™˜ν•˜κΈ°λ„ ν•œλ‹€.

728x90

'πŸ’œ λͺ¨λ˜Javascript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν•¨μˆ˜μ™€ 일급 객체  (0) 2022.09.28
ν”„λ‘œνΌν‹° μ–΄νŠΈλ¦¬λ·°νŠΈ  (1) 2022.09.28
μŠ€μ½”ν”„ (Scope)  (0) 2022.09.28
ν•¨μˆ˜  (0) 2022.09.28
μ›μ‹œκ°’κ³Ό 객체 비ꡐ  (0) 2022.09.28