๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ JavaScript

[JS Tam9์ƒํ™œ] #6 Prototype __proto__ [[Prototype]]

by Tamii 2021. 8. 8.
๋ฐ˜์‘ํ˜•

Prototype์„ ํ”ผํ•˜๊ฒŒ ๋œ ์ด์œ 

JavaScript๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ํ”„๋ฆฐ์ด๋ผ๋ฉด ์™ ์ง€ ํ”ผํ•˜๊ณ  ์‹ถ๊ณ  ๋Š๋‚Œ์ ์œผ๋กœ ์ดํ•ด๋Š” ๋˜์ง€๋งŒ ์ž…์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๊ทธ๋Ÿฐ ํ‚ค์›Œ๋“œ๋“ค์ด ์žˆ๋‹ค.

๊ทธ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ ๋‚ด๊ฐ€๋งŒ๋“ .

Prototype ์‚ผํ˜•์ œ


๊ทธ ์ด์œ ๋Š” pro~ ๋ฅผ ๋‚จ๋ฐœํ•˜๋Š” ์„ค๋ช… ๋•Œ๋ฌธ..
"์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ [[ํ”„๋กœํ† ํƒ€์ž…]]๋‚ด๋ถ€์Šฌ๋กฏ์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค~"

๊ทผ๋ฐ ์ด์นœ๊ตฌ๋“ค์„ ํ”ผํ•ด๋‹ค๋…”๋”๋‹ˆ ์ ์  ๋‚˜์˜ ์•ž๊ธธ์ด ๊ฐ€๋กœ๋ง‰ํžˆ๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜๊ณ (?)
๊ฑ”๋„ค๋“ค๊ณผ ํ•˜๋‚˜์”ฉ ๋งž์žฅ๋– ์„œ JS์งฑโ˜„๏ธ์„ ๋จน์œผ๋ ค๊ณ  ํ•œ๋‹ค.

๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..


Prototype

์ผ๋‹จ ํ•œ๋ฒˆ์— ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž๋ฉด

Prototype : ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ํ•˜์œ„ ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•จ
[[Prototype]]: ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด๋ถ€์Šฌ๋กฏ
__proto__ : ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ํ•จ

ํ”„๋กœํ† ํƒ€์ž…

์–ด๋–ค ๊ฐ์ฒด์˜ ์ƒ์œ„ ๊ฐ์ฒด ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋กœ ํ•˜์œ„ ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•œ๋‹ค.
JS๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์†์„ ๊ตฌํ˜„ํ•œ๋‹ค.

[[Prototype]]

๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋‚ด๋ถ€์Šฌ๋กฏ
ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค

__proto__ํ”„๋กœํผํ‹ฐ

Object.prototype์˜ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ
๋ชจ๋“  ๊ฐ์ฒด๋Š” proto๋ฅผํ†ตํ•ด ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ชจ๋“ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
    ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ƒ์†์„ ํ†ตํ•ด __proto__ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    const obj = {} obj.__proto__

Object.prototype

๋ชจ๋“  ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ๋ฌถ์—ฌ์žˆ๋Š”๋ฐ JS์—”์ง„์€ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ ํ•ด๋‹น ๊ฐ’์ด ์—†์œผ๋ฉด __proto__์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ๋”ฐ๋ผ ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํƒ์ƒ‰ํ•œ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

  • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ
  • ํ•˜์œ„ ๊ฐ์ฒด์—๊ฒŒ ์ƒ์œ„ ๊ฐ์ฒด์˜ ๊ณต์œ  ํ”„๋กœํผํ‹ฐ(+๋ฉ”์„œ๋“œ) ๊ณต์œ 
  • ์ƒ์†์˜ ๊ฐœ๋…์„ ๊ตฌํ˜„

prototype ํ”„๋กœํผํ‹ฐ

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ

  • ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Œ (์ƒ์„ฑ์žํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์ง€์ง€ ์•Š์€ ํ™”์‚ดํ‘œํ•จ์ˆ˜,์ถ•์•ฝ๋ฉ”์„œ๋“œ๋Š” ์—†๋‹ค)
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

prototypeํ”„๋กœํผํ‹ฐ์™€ proto

//prototypeํ”„๋กœํผํ‹ฐ === __proto__์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ
foo.prototype === foo1.__proto__


ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•  ๋•Œ ์—†์œผ๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๋”ฐ๋ผ ํ”„๋กœํ† ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐจ๋ก€๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ‘€ ๊ถ๊ธˆํ–ˆ๋˜ ์งˆ๋ฌธ๋“ค ์ •๋ฆฌ

โ“ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์˜ ํ”„๋กœํ† ํƒ€์ž…์€?

๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž…์€ ์กด์žฌ, constructorํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ == ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜ ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค. ๋‹ค๋งŒ ๊ฒฐ๋ก ์ ์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ๊ฐ๊ฐ์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

โ“ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ๋ญ”๊ฐ€์š”?

JS์—”์ง„์ด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ์„๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์— ์ฐพ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฉด ์ ‘๊ทผ์ž proto๋ฅผ ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ์˜ ํ”„๋กœํ† ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

โ“ํ”„๋กœํ† ํƒ€์ž… ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ์ธ๋ฐ์š”,

๋งŒ์•ฝ ์ง์ ‘ ํ”„๋กœํ† ํƒ€์ž…์—(๋‚ด๋ถ€์Šฌ๋กฏ์— )์ ‘๊ทผํ•˜์—ฌ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœํ† ํƒ€์ž…์ฒด์ธ์— ๋”ฐ๋ผ JS ์—”์ง„์ด ํƒ์ƒ‰ํ•  ๋•Œ ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— proto์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜์—ฌ ๊ต์ฒดํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์–ด์จ‹๋“  proto๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋ฐ, ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ proto๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

obj๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ข…์ ‘์ด๋‹ค. ๋”ฐ๋ผ์„œ Object.__proto__๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
const obj = Object.create(null)

ํ‚ค์›Œ๋“œ๋งŒ ์ •๋ฆฌํ•˜์ž๋ฉด,

ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰๊ฐ์ฒด์ด๋‹ค

์ผ๊ธ‰๊ฐ์ฒด์˜ ์กฐ๊ฑด
ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜,๋ฐ˜ํ™˜๊ฐ’ ๊ฐ€๋Šฅ, ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ ๊ฐ€๋Šฅ, ๋ณ€์ˆ˜์— ์ €์žฅ ๊ฐ€๋Šฅ
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
์ผ๋ฐ˜๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ํ•จ์ˆ˜ ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ณ ์œ ํ•œ๋‹ค.
ํ•จ์ˆ˜๊ฐ€๊ฐ€์ง„ ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ

arguments: ํ•จ์ˆ˜ ์ธ์ž์˜ ์ดํ„ฐ๋Ÿด ๋ฐ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด
length: ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜
name: ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž ๊ฐ’ (!=ํ•จ์ˆ˜ ์ด๋ฆ„)

[[Prototype]]

๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋‚ด๋ถ€์Šฌ๋กฏ
ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค
proto๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

prototype ํ”„๋กœํผํ‹ฐ

์ƒ์„ฑ์žํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๊ฐ€ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ
constructor๋งŒ์ด ์†Œ์œ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ

 

์š”์ฆ˜ ๊ธ€์„ velog์—๋„ ์˜ฌ๋ฆฌ๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ™์ด ์˜ฌ๋ ค๋†“์•˜๋‹ค. Tami์˜TILAND

 

๋Œ“๊ธ€