JavaScript Visualized: πŸŽ‰πŸ‘ͺ Prototypal Inheritance

Posted on September 03, 2020Β  - Β 5 min read

reference: https://dev.to/lydiahallie/javascript-visualized-prototypal-inheritance-47co

μš°λ¦¬κ°€ λ¬Έμžμ—΄μ΄λ‚˜ λ°°μ—΄ ν˜Ήμ€ κ°μ²΄μ—μ„œ μ–΄λ–»κ²Œ .length, .split(), .join() 같은 λ‚΄μž₯ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆλŠ”μ§€ κΆκΈˆν•˜μ‹  적이 μžˆμœΌμ…¨λ‚˜μš”? 우린 이런 것듀이 어디에 μžˆλŠ”μ§€ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•Šμ£ ? β€œμ•„λ¬΄λ„ λͺ¨λ₯΄λŠ” JavaScript의 λ§ˆλ²•μž…λ‹ˆλ‹€ πŸ§šπŸ»β€β™‚οΈβ€ λΌκ³ λŠ” ν•˜μ§€ λ§μ•„μ£Όμ„Έμš”. μ‹€μ œλ‘œλŠ” 이λ₯Ό ν”„λ‘œν† νƒ€μž… 상속이라고 λΆ€λ₯΄κ³ , 이건 μƒλ‹Ήνžˆ λŒ€λ‹¨ν•˜λ©° μ—¬λŸ¬λΆ„λ“€μ΄ μƒκ°ν•˜μ‹œλŠ” 것보닀 훨씬 더 자주 μ‚¬μš©ν•©λ‹ˆλ‹€!

우린 μ’…μ’… 같은 νƒ€μž…μ˜ 객체λ₯Ό 많이 μƒμ„±ν•˜μ£ . μ‚¬λžŒλ“€μ΄ 강아지λ₯Ό 검색할 수 μžˆλŠ” μ›Ή μ‚¬μ΄νŠΈκ°€ μžˆλ‹€κ³  해보죠!

λͺ¨λ“  강아지λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μš°λ¦¬λŠ” 객체가 ν•„μš”ν•©λ‹ˆλ‹€! πŸ• 맀번 μƒˆλ‘œμš΄ 객체λ₯Ό μž‘μ„±ν•˜λŠ” λŒ€μ‹ , new ν‚€μ›Œλ“œ(이번 ν¬μŠ€νŠΈμ—μ„œ μƒμ„±μž ν•¨μˆ˜λ₯Ό 닀루지 μ•ŠμŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ κΈΈμ–΄μ§€κ±°λ“ μš”)λ₯Ό μ‚¬μš©ν•˜μ—¬ 강아지 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλŠ” μƒμ„±μž ν•¨μˆ˜ (무슨 μƒκ°ν•˜μ‹€ 지 μ•Œ 것 κ°™μ•„μš”. ES6 ν΄λž˜μŠ€λŠ” λ‚˜μ€‘μ— λ‹€λ£° μ˜ˆμ •μž…λ‹ˆλ‹€!)λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  κ°•μ•„μ§€λŠ” 이름과, ν’ˆμ’…, 색, bark(μ§–λ‹€)λΌλŠ” ν•¨μˆ˜λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

prototypal inheritance 1

μš°λ¦¬κ°€ Dog μƒμ„±μž ν•¨μˆ˜λ₯Ό λ§Œλ“€λ©΄, 그건 μš°λ¦¬κ°€ λ§Œλ“  객체만 μžˆλŠ” 건 μ•„λ‹™λ‹ˆλ‹€. μžλ™μ μœΌλ‘œ 좔가적인 객체도 생성이 λ©λ‹ˆλ‹€. κ·Έκ±Έ ν”„λ‘œν† νƒ€μž…μ΄λΌκ³  ν•˜μ£ . 기본적으둜 이 ν”„λ‘œν† νƒ€μž… κ°μ²΄λŠ” constructorλΌλŠ” 속성을 ν¬ν•¨ν•˜λŠ”λ°, μ΄λŠ” μ›λž˜ μƒμ„±μž ν•¨μˆ˜μ— λŒ€ν•œ μ°Έμ‘°μž…λ‹ˆλ‹€. 이번 κ²½μš°μ—” Dog이죠.

1 || μƒμ„±μž ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§€λ©΄ prototype 객체 λ˜ν•œ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. μƒμ„±μžμ˜ prototype은 μ›λž˜ μƒμ„±μž ν•¨μˆ˜μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

Dog μƒμ„±μž ν•¨μˆ˜μ˜ prototype 속성은 μ—΄κ±°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, 이 객체 속성에 접근해보렀고 해도 보이지 μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€!

μ’‹μ•„μš”..그럼 μ™œ 이런 속성이 μžˆλŠ” κ±ΈκΉŒμš”? λ¨Όμ € 보여쀄 강아지λ₯Ό λ§Œλ“€μ–΄λ΄…μ‹œλ‹€. κ°„λ‹¨ν•˜κ²Œ dog1κ³Ό dog2라고 ν• κ»˜μš”. dog1은 Daisy이고, μ•„μ£Ό κ·€μ—¬μš΄ κ²€μ • λž˜λΈŒλΌλ„μ£ ! dog2λŠ” Jackμ΄μ˜ˆμš”. κ²μ—†λŠ” 흰 잭 λŸ¬μ…€μž…λ‹ˆλ‹€ 😎

prototypal inheritance 3

dog1을 μ½˜μ†”μ— 남겨보고 속성을 μ—΄μ–΄λ΄…μ‹œλ‹€!

μš°λ¦¬κ°€ μΆ”κ°€ν•œ name, breed, color 같은 속성듀이 보이고, bark도 있죠. 근데 μ € __proto__ 속성은 λ­”κ°€μš”! μ—΄κ±° ν•  수 μ—†λŠ” κ²ƒμœΌλ‘œ 보톡 κ°μ²΄μ—μ„œ μ € 속성듀을 μ–»μœΌλ €κ³  해도 보이지 μ•ŠλŠ” κ±Έ λ§ν•©λ‹ˆλ‹€. ν•œ 번 열어보죠! πŸ˜ƒ

μš°μ™€..이건 μ •ν™•νžˆ Dog.prototype 객체처럼 λ³΄μ΄λ„€μš”! 음 좔츑해보면, __proto__λŠ” Dog.prototype 객체의 참쑰인거죠. 이게 ν”„λ‘œν† νƒ€μž… μƒμ†μ˜ λͺ¨λ“  κ²ƒμž…λ‹ˆλ‹€: μƒμ„±μž ν•¨μˆ˜μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ€ μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€! 🀯

*3 || μΈμŠ€ν„΄μŠ€λŠ” proto λΌλŠ” 속성도 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€. 이번 μ˜ˆμ œμ—μ„  Dog.prototypeμž…λ‹ˆλ‹€.*

그럼 이게 μ™œ μ’‹μ„κΉŒμš”? λ•Œλ•Œλ‘œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ΄ κ³΅μœ ν•˜λŠ” 속성이 ν•„μš”ν•˜μ£ . 예λ₯Ό λ“€μ–΄ 이번 μ˜ˆμ œμ—μ„  barkν•¨μˆ˜κ°€ κ·Έλ ‡μŠ΅λ‹ˆλ‹€: λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ λ™μΌν•˜μ£ , 그럼 μ™œ 맀번 μƒˆλ‘œμš΄ 강아지λ₯Ό λ§Œλ“€ λ•Œ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λ‚˜μš”? 각각 λ‹€ λ©”λͺ¨λ¦¬λ₯Ό μž‘μ•„λ¨Ήμž–μ•„μš”. μ΄λ ‡κ²Œ ν•˜λŠ” λŒ€μ‹  우린 이걸 Dog.prototype 객체에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

4 || λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ΄ κ³΅μœ ν•˜λŠ” 속성에 λŒ€ν•΄ 맀번 볡사본을 λ§Œλ“œλŠ” λŒ€μ‹  prototype 속성에 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€μ—μ„œ μ–΄λ–€ 속성에 μ ‘κ·Όν•˜λ € ν•  λ•Œλ§ˆλ‹€ 엔진은 κ°€μž₯ λ¨Όμ € μ§€μ—­μ μœΌλ‘œ κ·Έ 객체 μžμ²΄μ— μ •μ˜λœ 속성이 μžˆλŠ”μ§€ κ²€μƒ‰ν•˜λ € ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ§Œμ•½ κ·Έ μ ‘κ·Ό κ°€λŠ₯ν•œ 속성을 찾지 λͺ»ν•  경우, 엔진은 __proto__ 속성을 톡해 ν”„λ‘œν† νƒ€μž… 체인을 따라 λ‚΄λ €κ°‘λ‹ˆλ‹€!

5 || 객체의 속성에 μ ‘κ·Όν•˜λ € ν•  λ•Œ, λ¨Όμ € λ‚΄λΆ€μ μœΌλ‘œ 검색을 ν•œ λ’€ proto 속성을 톡해 ν”„λ‘œν† νƒ€μž… 체인을 따라 λ‚΄λ €κ°‘λ‹ˆλ‹€.

이제 이건 ν•œ 단계일 λΏμ΄μ§€λ§Œ, λͺ‡ 단계가 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€! 계속 따라간닀면, μ—¬λŸ¬λΆ„λ“€μ€ Dog.prototype을 λ³΄μ—¬μ£ΌλŠ” __proto__ 객체λ₯Ό ν™•μž₯ν–ˆμ„ λ•Œ μ œκ°€ ν•˜λ‚˜μ˜ 속성을 ν¬ν•¨ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” κ±Έ μ•Œκ²Œ λ˜μ‹€ κ±°μ˜ˆμš”. Dog.prototype κ·Έ μžμ²΄λ„ λ˜ν•œ κ°μ²΄μž…λ‹ˆλ‹€. 즉, μ‹€μ œλ‘œ Object μƒμ„±μžμ˜ μΈμŠ€ν„΄μŠ€λΌλŠ”κ±°μ£ ! κ·Έ 말은 Dog.prototype λ˜ν•œ __proto__ 속성을 κ°–κ³  있으며 그것은 Object.prototype을 κ°€λ¦¬ν‚¨λ‹€λŠ” κ²λ‹ˆλ‹€!

λ§ˆμ§€λ§‰μœΌλ‘œ, λ‚΄μž₯ λ©”μ†Œλ“œλ“€μ΄ μ–΄λ””μ—μ„œ μ˜€λŠ”μ§€μ— λŒ€ν•œ 닡을 찾아보죠: 이것 λ˜ν•œ ν”„λ‘œν† νƒ€μž… μ²΄μΈμž…λ‹ˆλ‹€! πŸ˜ƒ

.toString() λ©”μ†Œλ“œλ‘œ 예λ₯Ό λ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. 이것이 dog1 객체에 μ§€μ—­μ μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆμ„κΉŒμš”? 음..μ•„λ‹ˆμ£ . 그럼 이건 dog1.__proto__κ°€ μ°Έμ‘°ν•˜λŠ” Dog.prototype 객체에 μ •μ˜λ˜μ–΄ μžˆλ‚˜μš”? 이것 λ˜ν•œ μ•„λ‹ˆμ£ ! 그럼 Dog.prototype.__proto__κ°€ μ°Έμ‘°ν•˜λŠ” Object.prototype에 μ •μ˜λ˜μ–΄ μžˆλ‚˜μš”? λ§žμŠ΅λ‹ˆλ‹€! πŸ™ŒπŸΌ

6 || ν”„λ‘œν† νƒ€μž… 체인은 μ—¬λŸ¬ 단계λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Dog.prototype κ·Έ μžμ²΄λ„ κ°μ²΄μ΄λ―€λ‘œ Object.prototype의 λ‚΄μž₯된 속성듀을 상속 λ°›μŠ΅λ‹ˆλ‹€.

μ§€κΈˆκΉŒμ§€ μš°λ¦¬κ°€ μ‚¬μš©ν•΄λˆ μƒμ„±μž ν•¨μˆ˜(function Dog() { ... })도 μ—¬μ „νžˆ μœ νš¨ν•œ JavaScriptμ΄μ§€λ§Œ, ES6λŠ” 더 μ‰¬μš΄ μƒμ„±μž ν•¨μˆ˜μ™€ ν”„λ‘œν† νƒ€μž…μ„ μœ„ν•œ ꡬ문을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€: 클래슀 μž…λ‹ˆλ‹€!

ν΄λž˜μŠ€λŠ” 였직 μƒμ„±μž ν•¨μˆ˜λ₯Ό μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μ‰¬μš΄ λ¬Έλ²•μž…λ‹ˆλ‹€. λͺ¨λ“  λ™μž‘ 방식은 κΈ°μ‘΄κ³Ό λ™μΌν•©λ‹ˆλ‹€!

class ν‚€μ›Œλ“œλ₯Ό 톡해 클래슀λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” constructor ν•¨μˆ˜λ₯Ό 가지며, μ΄λŠ” 기본적으둜 ES5 λ¬Έλ²•μ˜ μƒμ„±μž ν•¨μˆ˜μž…λ‹ˆλ‹€! ν”„λ‘œν† νƒ€μž…μ— μΆ”κ°€ν•˜κ³ μžν•œ 속성듀은 클래슀의 λ°”λ”” μ˜μ—­μ— μ„ μ–Έλ©λ‹ˆλ‹€.

7 || ES6λŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό μœ„ν•œ μ‰¬μš΄ 문법을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

클래슀의 또 λ‹€λ₯Έ μž₯점은 λ‹€λ₯Έ 클래슀둜의 상속(extend)이 μ‰½λ‹€λŠ” κ²λ‹ˆλ‹€.

μΉ˜μ™€μ™€λΌλŠ” 같은 ν’ˆμ’…μ˜ 강아지 λͺ‡ 마리λ₯Ό 보여주고 μ‹Άλ‹€κ³  해보죠! μΉ˜μ™€μ™€λ„ (μ–΄λ–»κ²Œλ“ β€¦ 😐) 강아지이죠. 예제λ₯Ό κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄, name, breed, color λŒ€μ‹  μ΄μ œλΆ€ν„° Dog ν΄λž˜μŠ€μ—μ„œλŠ” name μ†μ„±λ§Œ μ „λ‹¬λœλ‹€κ³  ν•˜κ² μŠ΅λ‹ˆλ‹€. 그런데 μΉ˜μ™€μ™€λŠ” μ•½κ°„ νŠΉλ³„ν•œ 뢀뢄이 μžˆλŠ”λ°, λ°”λ‘œ μž‘κ²Œ μ§–λŠ”λ‹€λŠ”κ±°μ£ . κ·Έλž˜μ„œ Woof! 라고 ν•˜λŠ” λŒ€μ‹ , μΉ˜μ™€μ™€λŠ” Small woof! 라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€ πŸ•

ν™•μž₯된 ν΄λž˜μŠ€μ—μ„œλŠ” super ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 μƒμ„±μžμ— 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 그리고 λΆ€λͺ¨ 클래슀의 μƒμ„±μžμ—μ„œ κΈ°λŒ€ν•˜λŠ” 인수λ₯Ό super에 전달해야 ν•©λ‹ˆλ‹€: 이번 μ˜ˆμ œμ—μ„  name 이죠.

prototypal inheritance 12

myPet은 Chihuahua.prototypeκ³Ό Dog.prototype λ‘˜ λ‹€ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€ (그리고 μžλ™μ μœΌλ‘œDog.prototype이 κ°μ²΄μ΄λ―€λ‘œ Object.prototype도 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€).

8 || ES5 μƒμ„±μžμ™€ λ™μΌν•œ λ°©λ²•μœΌλ‘œ ν΄λž˜μŠ€μ—μ„œλ„ ν”„λ‘œν† νƒ€μž… 상속이 λ™μž‘ν•©λ‹ˆλ‹€. super ν‚€μ›Œλ“œλ‘œ ν™•μž₯된 μ„œλΈŒν΄λž˜μŠ€λ„ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

Chihuahua.prototype은 smallBark ν•¨μˆ˜λ₯Ό κ°–κ³  있고, Dog.prototype은 bark ν•¨μˆ˜λ₯Ό κ°–κΈ° λ•Œλ¬Έμ—, myPetμ—μ„œλŠ” smallBark와 bark에 λ‘˜ λ‹€ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€!

μ—¬λŸ¬λΆ„λ“€λ„ μ˜ˆμƒν•˜μ‹€ 수 μžˆλ“―, ν”„λ‘œν† νƒ€μž…μ΄ μ˜μ›νžˆ 이어지진 μ•ŠμŠ΅λ‹ˆλ‹€. 객체의 ν”„λ‘œν† νƒ€μž…μ€ κ°€μž₯ 끝에 null이 λ©λ‹ˆλ‹€: 이번 μ˜ˆμ œμ—μ„  Object.prototype이 ν•΄λ‹Ήλ˜κ² λ„€μš”! λ§Œμ•½ μ§€μ—­μ μœΌλ‘œ λ˜λŠ” ν”„λ‘œν† νƒ€μž… μ²΄μΈμ—μ„œ 찾을 수 μ—†λŠ” 속성에 μ ‘κ·Όν•˜λ €κ³  ν•œλ‹€λ©΄, undefinedκ°€ λ°˜ν™˜λ  κ²ƒμž…λ‹ˆλ‹€.

9 || ν™•μž₯된 ν΄λž˜μŠ€μ—μ„œ 상속받은 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. protoκ°€ null일 경우 ν”„λ‘œν† νƒ€μž… 체인이 μ’…λ£Œλ©λ‹ˆλ‹€.


μƒμ„±μž ν•¨μˆ˜μ™€ ν΄λž˜μŠ€μ— λŒ€ν•œ λͺ¨λ“  것듀을 μ„€λͺ…ν–ˆμ§€λ§Œ, Object.create λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μΆ”κ°€ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ†Œλ“œλ₯Ό 톡해 우린 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³  κ·Έ 객체가 κ°€μ Έμ•Όν•  ν”„λ‘œν† νƒ€μž…μ„ μ •ν™•νžˆ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€! πŸ’ͺ🏼

Object.create λ©”μ†Œλ“œμ— 인자둜 λ§Œλ“€μ–΄μ§„ 객체λ₯Ό μ „λ‹¬ν•¨μœΌλ‘œμ¨ μ²˜λ¦¬ν•˜κ²Œ λ˜λŠ”λ°μš”. ν•΄λ‹Ή 객체가 μš°λ¦¬κ°€ μƒμ„±ν•œ 객체의 ν”„λ‘œν† νƒ€μž…μ΄ λ©λ‹ˆλ‹€!

prototypal inheritance 15

방금 λ§Œλ“  me 객체λ₯Ό 둜그둜 남겨보죠.

me 객체에 아무 속성듀도 μΆ”κ°€ν•˜μ§€ μ•Šμ•„μ„œ, λ‹¨μˆœν•˜κ²Œ μ—΄κ±°ν•  수 μ—†λŠ” __proto__ μ†μ„±λ§Œ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€! __proto__ 속성은 μš°λ¦¬κ°€ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ •μ˜ν•œ 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€: person 객체둜, nameκ³Ό age 속성이 있죠. person 객체도 객체이기 λ•Œλ¬Έμ—, person 객체의 __proto__ 속성은 Object.prototype이 λ©λ‹ˆλ‹€. (가독성을 μœ„ν•΄, gif에 κ·Έ ν”„λ‘œν† νƒ€μž…κΉŒμ§€ 열진 μ•Šμ•˜μŠ΅λ‹ˆλ‹€!)


JavaScriptμ—μ„œ ν”„λ‘œν† νƒ€μž… 속성이 μ™œ κ°€μž₯ μ€‘μš”ν•œ κΈ°λŠ₯인지 μ΄ν•΄ν•˜μ…¨κΈΈ λ°”λžλ‹ˆλ‹€! 질문이 μžˆμœΌμ‹œλ‹€λ©΄ μ–Έμ œλ“  μ—°λ½μ£Όμ„Έμš”! 😊