[🐱 μžλ°”μŠ€ν¬λ¦½νŠΈ] ν”„λ‘œν† νƒ€μž… [prototype]

dsfasdΒ·2022λ…„ 9μ›” 21일
0

μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ ν”„λ‘œν† νƒ€μž…

🍎 ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ

  • ν”„λ‘œν† νƒ€μž…μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 지ν–₯을 μ§€νƒ±ν•˜κ³  μžˆλŠ” 핡심 κΈ°λ°˜μ΄λ‹€.

ν”„λ‘œν† νƒ€μž…
μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 지ν–₯적 νŠΉμ„± 쀑 ν•˜λ‚˜μΈ 상속을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” ꡬ체적인 μˆ˜λ‹¨

ν”„λ‘œν† νƒ€μž…μ„ 톡해 상속이 κ°€λŠ₯해지고, 상속을 톡해 객체 지ν–₯성을 κ°€μ§ˆ 수 μžˆλ‹€.


ν”„λ‘œν† νƒ€μž…μ΄λž€

🍎 ν”„λ‘œν† νƒ€μž…μ€ 객체의 μ›ν˜•μ„ μ˜λ―Έν•œλ‹€.

prototype은 말 κ·ΈλŒ€λ‘œ 'μ›ν˜•', 'μ›ν˜• 객체' λΌλŠ” 의미λ₯Ό λ‹΄κ³ μžˆλ‹€.
μ•„λž˜ μ½”λ“œλ₯Ό 보면 μ΄ν•΄ν•˜κΈ° 더 쉽닀.

prototype ν”„λ‘œνΌν‹°μ—λŠ” 객체의 μ›ν˜•μ΄ λ‹΄κ²¨μžˆλ‹€.

βœ… __proto__ ν‚€μ›Œλ“œλ₯Ό 톡해 λΆ€λͺ¨ 클래슀의 ν”„λ‘œν† νƒ€μž…μ„ 확인 ν•  수 μžˆλ‹€.

βœ… .prototype ν‚€μ›Œλ“œλ₯Ό 톡해 ν”„λ‘œν† νƒ€μž… ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•œλ‹€.

ν”„λ‘œν† νƒ€μž… 예제

function Ultra(){}
Ultra.prototype.ultraProp = true;

function Super(){}
Super.prototype = new Ultra();

function Sub(){}
Sub.prototype = new Super();

var o = new Sub();
console.log(o.ultraProp) // true
console.log(Sub.prototype === o.__proto__) //true

μƒμ„±μž(Ultra, Super, Sub )λŠ” ν•¨μˆ˜μ— ν•΄λ‹Ήν•œλ‹€.

이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ”λ° μ•žμ— newλ₯Ό λΆ™μ—¬μ£Όλ©΄ λ‹¨μˆœν•œ ν•¨μˆ˜κ°€ μ•„λ‹Œ μƒμ„±μž ν•¨μˆ˜κ°€ λ˜λŠ” 것이고,
μ‹€ν–‰λœ κ²°κ³ΌλŠ” μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ–΄μ„œ O λ³€μˆ˜ μ•ˆμ— 리턴해주쀀닀.

πŸ—― 이 λ•Œ, μš°λ¦¬κ°€ μ–»κ³ μž ν•˜λŠ” 객체의 μ›ν˜•μ€ μ–΄λ”˜κ°€μ— μ €μž₯λ˜μ–΄ μžˆλŠ”λ° prototype이라 ν•˜λŠ” ν”„λ‘œνΌν‹°μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 것이닀.

Sub ν•¨μˆ˜λŠ” 객체이기 떄문에 ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§ˆ 수 있고,
Sub.prototype = new Super();
κ·Έ 쀑 νŠΉμˆ˜ν•œ ν”„λ‘œνΌν‹°μΈ prototype μ•ˆμ—λŠ” μ–΄λ– ν•œ 객체가 μ •μ˜λ˜μ–΄ μžˆλŠ” μ…ˆμ΄λ‹€.

κ·Έλ ‡κ²Œ 객체λ₯Ό μ €μž₯ν•΄λ’€λ‹€κ°€ new 둜 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 κ·Έ 객체λ₯Ό κΊΌλ‚΄λ‹€κ°€ λ¦¬ν„΄ν•΄μ£ΌλŠ” 방식이닀.


🍎 μƒμ„±μžμ™€ 빈 객체의 차이점은?

prototype은 객체의 μ›ν˜•μ΄λΌκ³  ν–ˆλ‹€.

λ”°λΌμ„œ 빈 클래슀의 ν”„λ‘œν† νƒ€μž…μ„ ν˜ΈμΆœν•œλ‹€λ©΄ new Object(); 객체λ₯Ό μ„ μ–Έν•œ 것과 사싀상 λ™μΌν•˜κ²Œ 빈 객체λ₯Ό 가진닀.

function func(){}
func.prototype //func {}

μ΄λŠ” new Object();λ₯Ό 좜λ ₯ν•œ κ°’κ³Ό λ™μΌν•˜λ‹€.

new Object(); //Object {}

빈 객체 μ•ˆμ— name 킀와 β€˜egoing’ μ΄λΌλŠ” 값을 주게 되면 ν‚€ 값이 좜λ ₯λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

var o = new func();
func.prototype.name = β€˜egoing’
o // func{name:”egoing”}

πŸ’‘ 빈 μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž… 객체 μ›ν˜•μ€ 일반적으둜 객체λ₯Ό μ„ μ–Έ, μ΄ˆκΈ°ν™”ν•˜μ—¬ λ§Œλ“  빈 객체와 λ™μΌν•œ κ°’({ })을 κ°–μ§€λ§Œ
일반 κ°μ²΄μ™€μ˜ 차이점은 객체λ₯Ό μƒμ„±ν• λ•Œ κ·Έ 객체가 가지고 μžˆμ–΄μ•Ό ν•  데이터, λ©”μ„œλ“œ, ν”„λ‘œνΌν‹° 값이 주어진닀.
κ·Έ 객체 μ•ˆμ—λŠ” ν•¨μˆ˜μ˜ 둜직 및 데이터가 λ‹΄κ²¨μžˆλ‹€.


prototype chain

ν”„λ‘œν† νƒ€μž…λ“€μ΄ μ„œλ‘œλ₯Ό μ°Έμ‘°ν•˜λ©΄μ„œ μ—°κ²°λ˜μ–΄ μžˆλŠ” ν˜•νƒœ

Sub.prototype은 new Super()의 객체λ₯Ό 가리킨닀.
이 κ°μ²΄λŠ” λ‹€μ‹œ Super.prototype을 가리킀고 이 ν”„λ‘œν† νƒ€μž…μ€ new Ultra(); 객체λ₯Ό 가리킨닀.

이런 λ°©μ‹μœΌλ‘œ ν”„λ‘œν† νƒ€μž…μ΄ μ„œλ‘œ μ—°κ²°λ˜μ–΄μžˆλŠ” 것을 ν”„λ‘œν† νƒ€μž… 체인이라고 λΆ€λ₯Έλ‹€.

ν”„λ‘œν† νƒ€μž… 체인은 상속과도 관련이 μžˆλ‹€. 상속을 κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ ν”„λ‘œν† νƒ€μž…μ΄ 체인처럼 κ΅¬ν˜„λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

[상속 κ΄€λ ¨ ν¬μŠ€νŒ…]
https://velog.io/@bommy5799/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%83%81%EC%86%8D

[좜처] μƒν™œμ½”λ”© - https://opentutorials.org/course/743/6573

profile
기둝을 μ •λ¦¬ν•˜λŠ” 곡간!

0개의 λŒ“κΈ€