JavaScript Visualized: ππͺ Prototypal Inheritance
Posted on September 03, 2020Β - Β 5 min readreference: https://dev.to/lydiahallie/javascript-visualized-prototypal-inheritance-47co
μ°λ¦¬κ° λ¬Έμμ΄μ΄λ λ°°μ΄ νΉμ κ°μ²΄μμ μ΄λ»κ² .length
, .split()
, .join()
κ°μ λ΄μ₯ λ©μλλ₯Ό μ¬μ©ν μ μμλμ§ κΆκΈνμ μ μ΄ μμΌμ
¨λμ? μ°λ¦° μ΄λ° κ²λ€μ΄ μ΄λμ μλμ§ λͺ
μμ μΌλ‘ μ§μ νμ§ μμ£ ? βμ무λ λͺ¨λ₯΄λ JavaScriptμ λ§λ²μ
λλ€ π§π»ββοΈβ λΌκ³ λ νμ§ λ§μμ£ΌμΈμ. μ€μ λ‘λ μ΄λ₯Ό νλ‘ν νμ
μμμ΄λΌκ³ λΆλ₯΄κ³ , μ΄κ±΄ μλΉν λλ¨νλ©° μ¬λ¬λΆλ€μ΄ μκ°νμλ κ²λ³΄λ€ ν¨μ¬ λ μμ£Ό μ¬μ©ν©λλ€!
μ°λ¦° μ’ μ’ κ°μ νμ μ κ°μ²΄λ₯Ό λ§μ΄ μμ±νμ£ . μ¬λλ€μ΄ κ°μμ§λ₯Ό κ²μν μ μλ μΉ μ¬μ΄νΈκ° μλ€κ³ ν΄λ³΄μ£ !
λͺ¨λ κ°μμ§λ₯Ό νννκΈ° μν΄ μ°λ¦¬λ κ°μ²΄κ° νμν©λλ€! π λ§€λ² μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ λμ , new
ν€μλ(μ΄λ² ν¬μ€νΈμμ μμ±μ ν¨μλ₯Ό λ€λ£¨μ§ μμ΅λλ€. λ무 κΈΈμ΄μ§κ±°λ μ)λ₯Ό μ¬μ©νμ¬ κ°μμ§ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ μμ±μ ν¨μ (λ¬΄μ¨ μκ°νμ€ μ§ μ κ² κ°μμ. ES6 ν΄λμ€λ λμ€μ λ€λ£° μμ μ
λλ€!)λ₯Ό μ¬μ©νλλ‘ νκ² μ΅λλ€.
λͺ¨λ κ°μμ§λ μ΄λ¦κ³Ό, νμ’ , μ, bark(μ§λ€)λΌλ ν¨μλ₯Ό κ°μ§λλ€.
μ°λ¦¬κ° Dog
μμ±μ ν¨μλ₯Ό λ§λ€λ©΄, 그건 μ°λ¦¬κ° λ§λ κ°μ²΄λ§ μλ 건 μλλλ€. μλμ μΌλ‘ μΆκ°μ μΈ κ°μ²΄λ μμ±μ΄ λ©λλ€. κ·Έκ±Έ νλ‘ν νμ
μ΄λΌκ³ νμ£ . κΈ°λ³Έμ μΌλ‘ μ΄ νλ‘ν νμ
κ°μ²΄λ constructorλΌλ μμ±μ ν¬ν¨νλλ°, μ΄λ μλ μμ±μ ν¨μμ λν μ°Έμ‘°μ
λλ€. μ΄λ² κ²½μ°μ Dog
μ΄μ£ .
1 || μμ±μ ν¨μκ° λ§λ€μ΄μ§λ©΄ prototype κ°μ²΄ λν λ§λ€μ΄μ§λλ€. μμ±μμ prototypeμ μλ μμ±μ ν¨μμ λν μ°Έμ‘°λ₯Ό κ°μ΅λλ€.
Dog μμ±μ ν¨μμ prototype
μμ±μ μ΄κ±°ν μ μμ΅λλ€. μ¦, μ΄ κ°μ²΄ μμ±μ μ κ·Όν΄λ³΄λ €κ³ ν΄λ 보μ΄μ§ μμ΅λλ€. νμ§λ§ μ¬μ ν μ‘΄μ¬ν©λλ€!
μ’μμ..κ·ΈλΌ μ μ΄λ° μμ±μ΄ μλ κ±ΈκΉμ? λ¨Όμ 보μ¬μ€ κ°μμ§λ₯Ό λ§λ€μ΄λ΄
μλ€. κ°λ¨νκ² dog1
κ³Ό dog2
λΌκ³ ν κ»μ. dog1
μ Daisyμ΄κ³ , μμ£Ό κ·μ¬μ΄ κ²μ λλΈλΌλμ£ ! dog2
λ Jackμ΄μμ. κ²μλ ν° μ λ¬μ
μ
λλ€ π
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
μ΄μ£ .
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
λ©μλμ μΈμλ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό μ λ¬ν¨μΌλ‘μ¨ μ²λ¦¬νκ² λλλ°μ. ν΄λΉ κ°μ²΄κ° μ°λ¦¬κ° μμ±ν κ°μ²΄μ νλ‘ν νμ
μ΄ λ©λλ€!
λ°©κΈ λ§λ me
κ°μ²΄λ₯Ό λ‘κ·Έλ‘ λ¨κ²¨λ³΄μ£ .
me
κ°μ²΄μ μ무 μμ±λ€λ μΆκ°νμ§ μμμ, λ¨μνκ² μ΄κ±°ν μ μλ __proto__
μμ±λ§ ν¬ν¨νκ³ μμ΅λλ€! __proto__
μμ±μ μ°λ¦¬κ° νλ‘ν νμ
μΌλ‘ μ μν κ°μ²΄μ λν μ°Έμ‘°λ₯Ό λ΄κ³ μμ΅λλ€: person
κ°μ²΄λ‘, name
κ³Ό age
μμ±μ΄ μμ£ . person
κ°μ²΄λ κ°μ²΄μ΄κΈ° λλ¬Έμ, person
κ°μ²΄μ __proto__
μμ±μ Object.prototype
μ΄ λ©λλ€. (κ°λ
μ±μ μν΄, gifμ κ·Έ νλ‘ν νμ
κΉμ§ μ΄μ§ μμμ΅λλ€!)
JavaScriptμμ νλ‘ν νμ μμ±μ΄ μ κ°μ₯ μ€μν κΈ°λ₯μΈμ§ μ΄ν΄νμ ¨κΈΈ λ°λλλ€! μ§λ¬Έμ΄ μμΌμλ€λ©΄ μΈμ λ μ°λ½μ£ΌμΈμ! π