πŸ“’ JavaScript

[Javascript] Prototype 을 ν†΅ν•œ 상속 κ³Ό __proto__ +(MDN 예제둜 λ³΄λŠ” Prototype 상속)

Tamii 2021. 3. 12. 18:38
λ°˜μ‘ν˜•

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ classλž€?

 

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

ν•¨μˆ˜ 호좜

객체 생성 

μ‹œ λ‚΄λΆ€ κ΅¬ν˜„

크둱의 μˆ˜μ—…κ³Ό μƒν™œμ½”λ”© js 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ°Έμ‘°ν•˜μ—¬

MDN에 μž‡λŠ” Class Model μƒμ†μ˜ˆμ œ -> Constructor function κ³Ό prototype을 μ΄μš©ν•˜μ—¬ 상속을 κ΅¬ν˜„ν•΄ λ³΄μ•˜λ‹€.

 

 

Class λ₯Ό μ΄μš©ν•œ 상속 

 

JavascriptλŠ” ν”„λ‘œν† νƒ€μž… based μ–Έμ–΄

μ›λž˜λŠ” class κ°€ 있기 전에 μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 상속을 κ΅¬ν˜„ν–ˆλ‹€.

λ”°λΌμ„œ Class 의 extends λ₯Ό ν”„λ‘œν† νƒ€μž…μ„ 톡해 κ΅¬ν˜„ν•΄λ³΄μž

 

 

 

 

 

 

Constructor function (μƒμ„±μž ν•¨μˆ˜) 및 객체 생성 

 

1) Car (λΆ€λͺ¨)  , Model (μžμ‹) μ΄λΌλŠ” μƒμ„±μž ν•¨μˆ˜ 생성

각자의 Prototype 객체가 생성됨 ( Car's prototype , Model's prototype

 

2) New μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄ mycar 객체 생성

__proto__ 

  : 객체가 κ°€μ§€κ²Œ λ˜λŠ” 속성

  : μžμ‹ μ„ μƒμ„±ν•œ μƒμ„±μž ν•¨μˆ˜μ˜ Prototype 이 가리킨 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ 됨 

 

 

3)  mycar.show() 호좜  

  1) mycar.show() μ°ΎκΈ°  -> X

  2) __proto__κ°€λ¦¬ν‚€λŠ” show() μ°ΎκΈ° -> O

 

Model의 showλ₯Ό 보면 Car의 λ©”μ„œλ“œ 인 presentλ₯Ό μ‚¬μš©ν•˜λŠ”λ° μ„œλ‘œ 연결이 λ˜μ–΄μžˆμ§€ μ•Šμ•„μ„œ undefined 

 

 

 

 

 

 

 

 

 

 

 

 

 

λΆ€λͺ¨μ™€ μžμ‹ Prototype 객체 μ—°κ²° 

Model 의 ν”„λ‘œν† νƒ€μž… 객체의 __proto__ Car의 ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•˜λ©΄ λœλ‹€

 

λΉ„ν‘œμ€€ 방식 : Model.prototype.__proto__ = Car.prototype 

 *  Model.prototype.__proto__κ°€ Car ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œν•¨ 

 * __(언더바)둜 μ‹œμž‘ν•˜λŠ” 것은 μ§μ ‘ν˜ΈμΆœν•˜μ§€ μ•ŠλŠ”κ²ƒμ΄ μ’‹λ‹€κ³  ν•˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έλ°©λ²•μ„ μ΄μš©ν•˜λŠ” 것이 μ’‹μŒ 

 

 

Object.create() 방식 

Model.prototype.show = Object.create(Car.prototype)

__proto__κ°€ Carν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μƒˆλ‘œμš΄ Model ν”„λ‘œνΌνƒ€μž…κ°μ²΄λ₯Ό μƒμ„±ν•œλ‹€.

 

이 λ§Œλ“€μ–΄μ§„  μƒˆλ‘œμš΄ 객체의 __proto__ λŠ”  Carν”„λ‘œν† νƒ€μž…κ°μ²΄λ₯Ό 가리킀기 떄문에 

present() λ₯Ό μ‚¬μš©ν•  수 μžˆκ²Œ λ©λ‹ˆλ‹€.

 

 

 

 

 

 

 

λΆ€λͺ¨(Car) 속성 을 μžμ‹(Model)μ—μ„œ μ‚¬μš© 

Car.call (this, brand)

Model's prototype에 __proto__ 속성이 μ‹€μˆ˜λ‘œ λΉ μ‘ŒμŠ΅λ‹ˆλ‹€.

 

 

Model.show ν•¨μˆ˜λŠ” κ²°κ΅­ this.present() μ—μ„œ Car 의 속성을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 

Car의 μš”μ†Œλ“€μ„ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•΄μ•Όν•¨  -> Car ν•¨μˆ˜λ₯Ό μ‹€ν–‰

 

Car.call (this, brand)

Car의 thisλ₯Ό Model 둜 λ§Œλ“  객체둜 λ°”κΏ”μ„œ μ‹€ν–‰ μ‹œν‚΄μœΌλ‘œμ¨  Car의 μš”μ†Œλ₯Ό Modelμ—μ„œ μ‚¬μš©ν•¨

 ( * Car의 thisλŠ”  Carμ•ˆμ—μ„œμ˜ this이기 λ•Œλ¬Έμ— Modelμ—μ„œ λ§Œλ“€μ–΄μ§ˆ mycarμ΄λΌλŠ” 객체둜 λ°”κΏ”μ„œ μ‹€ν–‰)

 

 

 

 

 

 

 

 

μ΄λ ‡κ²Œ 직접 prototype을 μ΄μš©ν•΄ 상속관계λ₯Ό κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ prototype κ³Ό __ptoro__의 κΈ°λŠ₯을 눈으둜 확인햇닀.

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μ΄ν•΄λŠ” ν–ˆμ§€λ§Œ 말둜 μ„€λͺ…ν•˜κΈ°λŠ” 또 μ–΄λ €μ›Œ prototype의 μ˜λ―Έμ™€ κ·Έ μž₯점을 ν•œλ§ˆλ””λ‘œ 정리해 λ³΄μ•˜λ‹€.

 

 


 

 

 

 

 

Prototype

 ν•¨μˆ˜κ°€ 선언될 λ•Œ μžλ™μœΌλ‘œ μ„ μ–Έλ˜λŠ” 속성 개체

 

μ‚¬μš©ν•˜λŠ” 이유

Constructor function (μƒμ„±μžν•¨μˆ˜)κ°€λ§Œλ“  λͺ¨λ“  κ°μ²΄λŠ” prototype을 톡해 μ„ μ–Έλœ 속성과 λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•¨

μ½”λ“œ μž¬μ‚¬μš© -> λ©”λͺ¨λ¦¬ 효율 높아짐 

 

 

 

ν”„λ‘œν† νƒ€μž…μ— λŒ€ν•œ λ‚˜λ§Œμ˜ μ •μ˜λ₯Ό ν•˜λ©° μ΄λ²ˆκΈ€μ€ 마무리!