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
'๐ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS Tam9์ํ] #8 ์๋ฐ์คํฌ๋ฆฝํธ์ this ๋? (0) | 2021.08.11 |
---|---|
[JS Tam9์ํ] #7 ๋นํธ์ธ ๊ฐ์ฒด (0) | 2021.08.09 |
[JS Tam9์ํ] #5 ํ๋กํผํฐ ์์ฑ๊ณผ ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ (0) | 2021.07.26 |
[JS Tam9์ํ] #4 Primitive VS Object (Reference) (0) | 2021.07.18 |
[JS Tam9์ํ] #3 ๊ฐ์ฒด์ ํ๋กํผํฐ (0) | 2021.07.17 |
๋๊ธ