[Javascript] Javascript Prototype

@μ΅œν˜„μ›…(Harry) Β· April 12, 2024 Β· 19 min read

πŸ–ŒοΈ μ„œλ‘ 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ…λ Ήν˜•, ν•¨μˆ˜ν˜•, ν”„λ‘œν† νƒ€μž… 기반 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜λŠ” λ©€ν‹° νŒ¨λŸ¬λ‹€μž„ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‹€.
이번 κΈ€μ—μ„œλŠ” ν”„λ‘œν† νƒ€μž…μ— μ΄ˆμ μ„ λ§žμΆ”μ–΄ ν”„λ‘œν† νƒ€μž…μ΄ 무엇이고, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘œν† νƒ€μž…μ΄ μ–΄λ–»κ²Œ μ΄μš©λ˜λŠ”μ§€λ₯Ό κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

const arr = [1, 2, 3]

arr.sort((a, b) => a - b)

μΆ”κ°€λ‘œ λ°°μ—΄ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ arr 이 μ–΄λ–»κ²Œ sort 와 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”μ§€λ„ ν”„λ‘œν† νƒ€μž… κ΄€μ μ—μ„œ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€. ν”„λ‘œν† νƒ€μž…μ— λŒ€ν•΄μ„œ μ΄ν•΄ν•˜λ €λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 객체λ₯Ό μ–΄λ–»κ²Œ λ°”λΌλ³΄λŠ”μ§€λ₯Ό 이해할 ν•„μš”κ°€ μžˆλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 클래슀 기반 객체지ν–₯ 언어인 Java, C++ κ³Ό 객체λ₯Ό λ°”λΌλ³΄λŠ” μ‹œμ„ μ΄ μ•½κ°„ λ‹€λ₯΄λ‹€.

πŸ’­ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 객체λ₯Ό λ°”λΌλ³΄λŠ” μ‹œμ„ 

μš°μ„  클래슀 기반 객체지ν–₯ 언어인 Java, C++이 객체λ₯Ό μ–΄λ–»κ²Œ λ°”λΌλ³΄λŠ”μ§€λ₯Ό μ•Œμ•„λ³΄μž. 클래슀 기반 객체지ν–₯ μ–Έμ–΄λŠ” μ΄λ¦„μ—μ„œλ„ μ•Œ 수 μžˆλ“―μ΄ λΆ„λ₯˜(Classification)λ₯Ό 톡해 객체λ₯Ό κ΅¬λΆ„ν•œλ‹€. 속성이 λ™μΌν•œ κ°œμ²΄λ“€μ΄ μžˆλŠ” 경우, ν•΄λ‹Ή κ°œμ²΄λ“€μ„ 같은 λ²”μ£Όλ‘œ 묢을 수 μžˆλ‹€κ³  λ³Έλ‹€. μ—¬κΈ°μ„œ 속성은 ν”„λ‘œκ·Έλž˜λ° κ΄€μ μ—μ„œ 봀을 λ•Œ, 클래슀(클래슀둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€)의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€. ν”„λ‘œνΌν‹°κ°€ μœ μ‚¬ν•œ 객체가 μžˆλ‹€λ©΄, μΌλ°˜ν™” 과정을 ν†΅ν•΄μ„œ 클래슀둜 μΆ”μƒν™”λœλ‹€.

μ΄λŠ” 세상을 μ΄λΆ„λ²•μ μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ λ³΄μ•˜λ˜, μ„œμ–‘μ² ν•™κ³Ό μ—°κ²°λœλ‹€. (영혼 / 윑체, 좔상 / ꡬ체, 사물 / 본질)

눈 μ•žμ— μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” 사물이 μžˆλ‹€λ©΄ λ°˜λ“œμ‹œ κ·Έ μ‚¬λ¬Όμ˜ 본질이 μ‘΄μž¬ν•œλ‹€. - ν”ŒλΌν†€

μžμ „κ±°λ₯Ό 예둜 λ“€μžλ©΄ λ„€λ°œ, μ„Έλ°œ, λ‘λ°œ, ν•œλ°œ μžμ „κ±°κ°€ μžˆμ„ 것이며 이 λ•Œ λ°˜λ“œμ‹œ 본질적이고 좔상적인 μžμ „κ±°κ°€ μ‘΄μž¬ν•œλ‹€κ³  λ³Έλ‹€.

class Cycle {
...
}

Cycle harryCycle = new Cycle();

μΆ”μƒμ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” μžμ „κ±°(Cycle)κ°€ new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ ν˜„μ‹€μ„Έκ³„μ— ꡬ체적으둜 쑴재(harryCycle)ν•˜κ²Œ λœλ‹€κ³  λ³Έλ‹€.
ν•˜μ§€λ§Œ, ν”„λ‘œν† νƒ€μž… μ΄λ‘ μ—μ„œλŠ” κ°μ²΄λŠ” μ •μ˜λ₯Ό ν†΅ν•΄μ„œ λΆ„λ₯˜(Classification)λ˜λŠ” 것이 μ•„λ‹ˆλΌ κ°€μž₯ 쒋은 보기둜 λΆ€ν„° λ²”μ£Όν™” λ˜λŠ” 것이라고 λ³Έλ‹€.

birds

예λ₯Ό λ“€μ–΄, 인간이 μƒˆλ₯Ό λΆ„λ₯˜ν•œλ‹€κ³  ν•  λ•Œ μžμ—°μŠ€λŸ½κ²Œ κ°€μž₯ μœ μ‚¬μ„±μ΄ 높은 μˆœμƒˆλŒ€λ‘œ 등급을 맀긴닀고 λ³Έλ‹€. μ΄λ ‡κ²Œ λΆ„λ₯˜ν–ˆμ„ λ•Œ, κ°€μž₯ 높은 등급이 λ‚˜μ˜€λŠ” μƒˆλ₯Ό μƒˆμ˜ μ›ν˜•(Prototype)으둜 λ³΄λŠ”κ²Œ ν”„λ‘œν† νƒ€μž… 이둠이닀.

즉, β€˜κ°€μž₯ μƒˆ λ‹€μš΄ 것, μƒˆμŠ€λŸ¬μš΄ 것’을 μƒˆμ˜ μ›ν˜•(Prototype) 이라고 λ³Έλ‹€. μœ„ μ˜ˆμ‹œμ—μ„œλŠ” μ°Έμƒˆκ°€ μƒˆμ˜ λ²”μ£Όλ₯Ό λŒ€ν‘œν• λ§Œν•œ μ „ν˜•μ μΈ μƒˆλ‘œ λ³Έλ‹€. ν”„λ‘œν† νƒ€μž… μ΄λ‘ μ—λŠ” 객체λ₯Ό μœ μ‚¬μ„±μ„ κΈ°μ€€μœΌλ‘œ λ°”λΌλ³΄λŠ” 것 이외에 또 ν•œ 가지 μ€‘μš”ν•œ 것이 μžˆλ‹€. λ°”λ‘œ 같은 단어라고 할지라도 λˆ„κ°€ μ–΄λ–€ 상황(context)μ—μ„œ μ‚¬μš©ν–ˆλƒ, μ ‘ν–ˆλƒμ— λ”°λΌμ„œ μ˜λ―Έκ°€ 달라진닀고 λ³΄λŠ” 것이닀.

예λ₯Ό λ“€μ–΄, λ‚˜(해리)κ°€ μƒκ°ν–ˆμ„ λ•ŒλŠ” μƒˆμ˜ 범주에 β€˜μ˜€λ¦¬β€™κ°€ 속할 수 μžˆμ§€λ§Œ μ§€λ‹ˆκ°€ μƒκ°ν–ˆμ„ λ•ŒλŠ” μƒˆμ˜ 범주에 β€˜μ˜€λ¦¬β€™κ°€ μ†ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. 같은 단어(μƒˆ)라도 μ–΄λ–€ 상황(λ‚˜ or μ§€λ‹ˆ)μ—μ„œ μ ‘ν–ˆλŠλƒμ— λ”°λΌμ„œ λ²”μ£Ό(의미)κ°€ 크게 달라진닀고 λ³Έλ‹€.

μ΄λŠ” λ‹¨μ–΄μ˜ μ§„μ •ν•œ 본래의 의미(전톡적인 μ„œμ–‘μ² ν•™μ—μ„œμ˜ 본질)은 μ‘΄μž¬ν•˜μ§€ μ•Šκ³  λ‹¨μ–΄μ˜ μ˜λ―ΈλŠ” μ‚¬μš©ν•˜λŠ” 상황과 λ§₯락에 μ˜ν•΄ κ²°μ •λœλ‹€κ³  λ³Έ λΉ„νŠΈμΌ„μŠˆνƒ€μΈμ˜ 의미 μ‚¬μš© 이둠을 기반으둜 ν•œλ‹€.

세계에 미리 λ‚΄μž¬λ˜μ–΄μ„œ λŒ€μƒκ³Ό μ–Έμ–΄λ₯Ό μ™„μ „νžˆ κ·œμ •ν•˜λŠ” μ–΄λ–€ μ–Έμ–΄λž€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. β€” λΉ„νŠΈκ²μŠˆνƒ€μΈ

μ •λ¦¬ν•˜μžλ©΄ ν”„λ‘œν† νƒ€μž… μ΄λ‘ μ—μ„œλŠ”

  • κ°€μž₯ 쒋은 본보기λ₯Ό μ›ν˜•μœΌλ‘œ μ„ νƒν•œλ‹€.
  • νŠΉμ • 상황(λ¬Έλ§₯, μ»¨ν…μŠ€νŠΈ)에 λ”°λΌμ„œ νŠΉμ • λ‹¨μ–΄μ˜ λ²”μ£Ό(의미)κ°€ 달라진닀.

κ³  λ³Έλ‹€.

λ”°λΌμ„œ, ν”„ν† ν† νƒ€μž… 기반 언어인 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°μ²΄μ—λŠ” μ›ν˜•μ΄ μžˆλ‹€κ³  λ΄€κ³ , μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€ λ•Œ κ·Έ μ›ν˜•μ„ 볡제(μ°Έμ‘°)ν•΄μ„œ λ§Œλ“œλŠ” 방법을 μ‚¬μš©ν–ˆλ‹€.

μ„ μ–Έλ˜λŠ” μœ„μΉ˜(ν™˜κ²½)에 따라 μŠ€μ½”ν”„(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ λ‚΄ ν™˜κ²½ λ ˆμ½”λ“œ)κ°€ κ²°μ •λ˜κ³ , μ‚¬μš©λ˜λŠ” 상황(λ¬Έλ§₯)에 λ”°λΌμ„œ thisκ°€ κ²°μ •λ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μ΄ λ– μ˜€λ₯΄μ§€ μ•ŠλŠ”κ°€? 😊

πŸ’­ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘œν† νƒ€μž…

μœ„ λ‚΄μš©μ—μ„œ ν”„λ‘œν† νƒ€μž…μ€ μ–΄λ–€ λ²”μ£Όμ—μ„œ κ°€μž₯ 쒋은 보기, μ›ν˜•μ΄λΌκ³  ν–ˆμ—ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘œν† νƒ€μž…μ€ μ–΄λ–»κ²Œ μ‚¬μš©λ κΉŒ?
μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ›μ‹œ νƒ€μž…μ˜ κ°’(String, Number, Boolean…)을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ κ°’(Array, Function,,,)듀은 λͺ¨λ‘ 객체이닀. κ°μ²΄λŠ” λ‹€λ₯Έ 객체듀과 λ©”μ‹œμ§€λ₯Ό μ£Όκ³  λ°›κ±°λ‚˜ 데이터λ₯Ό μ²˜λ¦¬ν•  μˆ˜λ„ 있고, λ‹€λ₯Έ 객체의 μƒνƒœ λ°μ΄ν„°λ‚˜ λ™μž‘μ„ μƒμ†λ°›μ•„μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. 이 λ•Œ, ν”„λ‘œν† νƒ€μž…μ΄ 상속을 μœ„ν•΄μ„œ μ‚¬μš©λœλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ–΄λ–€ 객체λ₯Ό μ›ν˜•(Prototype)으둜 μ‚Όκ³  이λ₯Ό λ³΅μ œν•¨μœΌλ‘œμ¨ 상속과 λΉ„μŠ·ν•œ 효과λ₯Ό 내도둝 ν•œλ‹€.

prototype 객체

ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ” μƒμœ„ 객체의 역할을 ν•˜λŠ” 객체둜써, λ‹€λ₯Έ 객체에 곡유 ν”„λ‘œνΌν‹°λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€. ν”„λ‘œν† νƒ€μž…μ„ 상속받은 ν•˜μœ„ κ°μ²΄λŠ” μƒμœ„ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μžμ‹ μ˜ ν”„λ‘œνΌν‹°μ²˜λŸΌ 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€.

λͺ¨λ“  κ°μ²΄λŠ” [[Prototype]] μ΄λΌλŠ” λ‚΄λΆ€ μŠ¬λ‘―μ„ 가지며, 이 λ‚΄λΆ€ 슬둯의 값은 ν”„λ‘œν† νƒ€μž…(μ›ν˜•)에 λŒ€ν•œ 참쑰이닀. 즉 [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ€ ν•΄λ‹Ή 객체의 μ›ν˜•μ„ κ°€λ₯΄ν‚¨λ‹€(μ°Έμ‘°ν•œλ‹€). [[Prototype]]이 μ°Έμ‘°ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체(μƒμœ„ 객체, μ›ν˜•)λŠ” 객체 생성 방식에 λ”°λΌμ„œ κ²°μ •λœλ‹€.

λͺ¨λ“  κ°μ²΄λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œν† νƒ€μž…μ„ 가지며 즉, μ›ν˜•μ„ 가지며 λͺ¨λ“  ν”„ν† ν† νƒ€μž…μ€ ν•΄λ‹Ή 객체λ₯Ό μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ™€ μ—°κ²°λ˜μ–΄ μžˆλ‹€. μ‰½κ²Œ λ§ν•˜μžλ©΄, μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œνΌν‹°μ— ν”„λ‘œν† νƒ€μž… 객체가 μžˆλ‹€.

const arr = [1, 2, 3]

arr.sort((a, b) => a - b)

λ°°μ—΄ λ¦¬ν„°λŸ΄λ‘œ 배열을 μƒμ„±ν•œ ν›„, sort λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν–ˆλ˜ μœ„ μ˜ˆμ‹œλ₯Ό λ‹€μ‹œ ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž. λ°°μ—΄ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±λœ 배열도, Array μƒμ„±μž ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ μƒμ„±λœ λ°°μ—΄ 객체둜 λ³Ό 수 있으며 μƒμ„±λœ λ°°μ—΄ 객체 arr 의 [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ€ Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ₯΄ν‚¨λ‹€.

arr array

arr prototype

μœ„ μ΄λ―Έμ§€μ—μ„œλ„ 확인할 수 μžˆλ“―μ΄, λ°°μ—΄ λ¦¬ν„°λŸ΄ λ°©μ‹μœΌλ‘œ μƒμ„±λœ λ°°μ—΄ 객체의 [[Prototype]]은 Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ₯΄ν‚¨λ‹€.

μ •λ¦¬ν•˜μžλ©΄, Array μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±λœ λ°°μ—΄ κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…(μ›ν˜•)을 λ³΅μ œν•¨μœΌλ‘œμ¨ μƒμ„±λ˜κ³  ν”„λ‘œν† νƒ€μž… 객체λ₯Ό 상속 λ°›μ•„μ„œ 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹€.

이둜 μΈν•΄μ„œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 같은 λͺ…μ‹œμ μΈ 상속 없이, μƒμœ„ 객체의 λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•  수 있게 λ˜λŠ” 것이닀. ν•œκ°€μ§€ 짚고 λ„˜μ–΄κ°€μ•Όν•  점은, Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž… 내뢀에 μžˆμ§€ μ•Šμ€ from, of, isArrayλŠ” μƒμ„±λœ λ°°μ—΄ κ°μ²΄μ—μ„œ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 것이닀. 였직 μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž… 내뢀에 μžˆλŠ” ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œλ“€μ„ 상속 λ°›μ•„μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
from, of, isArray와 같은 λ©”μ„œλ“œλ“€μ€ μƒμ„±μž ν•¨μˆ˜μ—μ„œ 직접 μ ‘κ·Όν•΄μ•Ό 싀행이 κ°€λŠ₯ν•˜λ‹€. 이 λ©”μ„œλ“œλ“€μ„ μŠ€νƒœν‹± λ˜λŠ” 정적 λ©”μ„œλ“œλΌκ³  ν•œλ‹€.

const arr = [1, 2, 3]

console.log(Array.isArray(arr)) // true

console.log(arr.isArray(arr)) // TypeError : arr.isArray is not a function

μƒμ„±λœ λ°°μ—΄ κ°μ²΄μ—μ„œ isArray λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ €κ³  ν•˜λ©΄ TypeErrorκ°€ λ°œμƒν•œλ‹€.

__proto__ ν”„λ‘œνΌν‹°

λͺ¨λ“  κ°μ²΄λŠ” __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό 가지며, ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•΄μ„œ μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž…(μ›ν˜•) 즉, [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ— κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›μΉ™μ μœΌλ‘œ [[Prototype]]κ³Ό 같은 λ‚΄λΆ€ μŠ¬λ‘―μ— 직접 μ ‘κ·Όν•˜λŠ” 방법을 μ œκ³΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, κ°„μ ‘μ μœΌλ‘œ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” 방법인 __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν„°λ₯Ό μ œκ³΅ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ, ν•΄λ‹Ή 객체에 μ ‘κ·Όν•˜λ €λŠ” ν”„λ‘œνΌν‹°κ°€ μ—†λ‹€λ©΄ __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°κ°€ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ₯Ό λ”°λΌμ„œ μžμ‹ μ˜ λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό 순차적으둜 κ²€μƒ‰ν•œλ‹€.

μœ„ λ°°μ—΄ μ˜ˆμ‹œμ—μ„œλ„, μƒμ„±λœ λ°°μ—΄ 객체(arr)μ—λŠ” sort λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•΄μ„œ λ°°μ—΄ 객체의 ν”„λ‘œν† νƒ€μž…μΈ Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…μ—μ„œ sort λ©”μ„œλ“œλ₯Ό κ²€μƒ‰ν•œ ν›„ μ‚¬μš©ν•œ 것이닀.

circle prototype

const arr = [1, 2, 3]

console.log(arr.__proto__ === Array.prototype) // true

console.log(arr.hasOwnProperty("__proto__")) // false

console.log(Object.prototype.hasOwnProperty("__proto__")) // true

ν•œκ°€μ§€ 짚고 λ„˜μ–΄κ°€μ•Όν•  점은, μœ„ μ΄λ―Έμ§€μ²˜λŸΌ __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λŠ” μƒμ„±λœ 객체가 직접 μ†Œμœ ν•˜λŠ” μˆ¨κ²¨μ§„ ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλΌ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ΅œμƒμœ„ 객체인 Object.prototype의 ν”„λ‘œνΌν‹°μ΄λ‹€.

λͺ¨λ“  κ°μ²΄λŠ” Object.prototype의 상속을 ν†΅ν•΄μ„œ Object.prototype.__proto__ λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ€” λ³΅μ œν•œλ‹€λŠ” κ²ƒμ˜ 의미

ν”„λ‘œν† νƒ€μž…μ— λŒ€ν•΄μ„œ ν•™μŠ΅ν•˜λ©΄μ„œ,

μ–΄λ–€ 객체λ₯Ό μ›ν˜•(Prototype)으둜 μ‚Όκ³  이λ₯Ό λ³΅μ œν•¨μœΌλ‘œμ¨ 상속과 λΉ„μŠ·ν•œ 효과λ₯Ό 내도둝 ν•œλ‹€.

이 λ¬Έμž₯이 개인적으둜 잘 와닿지 μ•Šμ•˜μ—ˆλ‹€. 특히 β€œλ³΅μ œβ€ν•œλ‹€λŠ” 것이 제일 와닿지 μ•Šμ•˜λŠ”λ° κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό ν†΅ν•΄μ„œ μ–΄λŠ 정도 이해할 수 μžˆμ—ˆλ‹€.

const arr = [1, 2, 3]
const brr = [4, 5, 6]
console.log(arr.__proto__ === brr.__proto__)

console.log(arr.sort === brr.sort); μœ„ μ½”λ“œμ—μ„œ 각각 μ½˜μ†”μ—λŠ” 무엇이 좜λ ₯될까?
λͺ¨λ‘ true κ°€ 좜λ ₯λœλ‹€.

circle prototype 2

μœ„ μ΄λ―Έμ§€μ—μ„œ 확인할 수 μžˆλ“―, μƒμ„±λœ λ°°μ—΄ 객체의 ν”„λ‘œν† νƒ€μž…μ€ λͺ¨λ‘ Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…μ„ κ°€λ₯΄ν‚€κ³  μžˆλ‹€.
Array μƒμ„±μž ν•¨μˆ˜μ˜ ν”„λ‘œν† νƒ€μž…μ„ μ›ν˜•μœΌλ‘œ μ‚Όκ³ , 이λ₯Ό λ³΅μ œν•˜μ—¬ λ°°μ—΄ 객체λ₯Ό μƒμ„±ν•œ 것이며 μƒμ„±λœ λ°°μ—΄ 객체듀이 proto ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•΄μ„œ μ°Έμ‘°ν•˜κ²Œλ˜λŠ” ν”„λ‘œν† νƒ€μž…μ€ λͺ¨λ‘ 같은 ν”„λ‘œν† νƒ€μž…μ΄λ‹€.
ν”„λ‘œν† νƒ€μž…(μ›ν˜•)을 λ³΅μ œν•œλ‹€ === μƒμ„±λœ λ°°μ—΄ 객체듀이 λͺ¨λ‘ 같은 ν”„λ‘œν† νƒ€μž…μ„ μ°Έμ‘°ν•œλ‹€ 둜 해석할 수 μžˆλ‹€.

πŸ’­ ν”„λ‘œν† νƒ€μž… 체인

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ, ν•΄λ‹Ή 객체에 μ ‘κ·Όν•˜λ €λŠ” ν”„λ‘œνΌν‹°κ°€ μ—†λ‹€λ©΄ __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•΄μ„œ λΆ€λͺ¨ 역할을 ν•˜λŠ” ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό 순차적으둜 κ²€μƒ‰ν•œλ‹€κ³  ν–ˆμ—ˆλ‹€.

이λ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라고 ν•˜λ©°, ν”„λ‘œν† νƒ€μž… 체인은 상속과 ν”„λ‘œνΌν‹° 검색을 μœ„ν•œ λ§€μ»€λ‹ˆμ¦˜μ΄λΌκ³  ν•  수 μžˆλ‹€.

const arr = [1, 2, 3]

arr.name = "harry"

console.log(arr.hasOwnProperty("name")) // true

λ°°μ—΄ 객체에 νŠΉμ • ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•˜λŠ” κ²½μš°λŠ” ν”ν•˜μ§€ μ•Šμ§€λ§Œ, ν”„λ‘œν† νƒ€μž… 체인 과정을 이해해보기 μœ„ν•΄μ„œ μœ„ μ½”λ“œμ™€ 같은 λ°°μ—΄ 객체가 μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

circle prototype 3

hasOwnProperty λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, λ‹€μŒκ³Ό 같은 과정을 κ±°μ³μ„œ λ©”μ„œλ“œλ₯Ό κ²€μƒ‰ν•œλ‹€.

  1. Array.prototype

μš°μ„ , ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ arr λ°°μ—΄ κ°μ²΄μ—μ„œ hasOwnPropertyλ₯Ό κ²€μƒ‰ν•œλ‹€.

λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν”„λ‘œν† νƒ€μž… 체인을 λ”°λΌμ„œ 즉, [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ— λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” ν”„ν† λ‘œνƒ€μž…(μ›ν˜•)으둜 μ΄λ™ν•˜μ—¬ hasOwnPropertyλ₯Ό κ²€μƒ‰ν•œλ‹€.

  1. Object.prototype

Array.prototype에도 hasOwnPropertyκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ”°λΌμ„œ, λ‹€μ‹œ ν”„λ‘œν† νƒ€μž… 체인을 λ”°λΌμ„œ 즉, Array.prototype 객체의 [[Prototype]] λ‚΄λΆ€ μŠ¬λ‘―μ— λ°”μΈλ”©λ˜μ–΄ μžˆλŠ” ν”„ν† ν† νƒ€μž…(μ›ν˜•)인 Object.prototype으둜 μ΄λ™ν•˜μ—¬ hasOwnPropertyλ₯Ό κ²€μƒ‰ν•œλ‹€.
(μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œν† νƒ€μž…μ€ μ–Έμ œλ‚˜ μ΅œμƒμœ„ 객체인 Object.prototype이닀.)

ν”„λ‘œν† νƒ€μž… 체인의 μ΅œμƒμœ„μ— μœ„μΉ˜ν•˜λŠ” κ°μ²΄λŠ” μ–Έμ œλ‚˜ Object.prototype이닀. λ”°λΌμ„œ λͺ¨λ“  κ°μ²΄λŠ” Object.prototype을 μƒμ†λ°›λŠ”λ‹€.
즉, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” κ°€μž₯ 객체 λ‹€μš΄ 것, 객체슀러운 것을 Object.prototype(μ›ν˜•)으둜 봀으며 이 μ›ν˜•μ„ λ³΅μ œν•΄μ„œ μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€λ„λ‘ ν–ˆλ‹€.

반면, 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹Œ μ‹λ³„μžλŠ” μŠ€μ½”ν”„ μ²΄μΈμ—μ„œ κ²€μƒ‰ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ“€μ˜ 쀑첩 κ΄€κ³„λ‘œ 이루어진 μŠ€μ½”ν”„μ˜ 계측적 κ΅¬μ‘°μ—μ„œ μ‹λ³„μžλ₯Ό 검색 μ‹λ³„μžλ₯Ό κ²€μƒ‰ν•œλ‹€. λ”°λΌμ„œ, μŠ€μ½”ν”„ 체인은 μ‹λ³„μž 검색을 μœ„ν•œ λ§€μ»€λ‹ˆμ¦˜μ΄λΌκ³  ν•  수 μžˆλ‹€.

πŸ“š 정리

  • ν”„λ‘œν† νƒ€μž…μ€ μ–΄λ–€ λ²”μ£Όμ—μ„œ κ°€μž₯ 쒋은 보기, μ›ν˜•μ΄λ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ–΄λ–€ 객체λ₯Ό μ›ν˜•(Prototype)으둜 μ‚Όκ³  이λ₯Ό λ³΅μ œν•¨μœΌλ‘œμ¨ 상속과 λΉ„μŠ·ν•œ 효과λ₯Ό λ‚Έλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  κ°μ²΄λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œν† νƒ€μž…μ„ 가지며 즉, μ›ν˜•μ„ 가지며 λͺ¨λ“  ν”„ν† ν† νƒ€μž…μ€ ν•΄λ‹Ή 객체λ₯Ό μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ™€ μ—°κ²°λ˜μ–΄ μžˆλ‹€.
  • ν”„λ‘œν† νƒ€μž… 체인은 상속과 ν”„λ‘œνΌν‹° 검색을 μœ„ν•œ λ§€μ»€λ‹ˆμ¦˜μ΄λ‹€.

πŸ”— μ°Έκ³ 

@μ΅œν˜„μ›…(Harry)
의미 μ—†λŠ” 기둝은 μ—†λ‹€κ³  μƒκ°ν•˜λ©°, ν•™μŠ΅ν•˜κ³  λŠλ‚€ 것듀을 κΈ°λ‘ν•©λ‹ˆλ‹€ :)