October 31, 2020
์๋ฐ์คํฌ๋ฆฝํธ Class ๋ฌธ๋ฒ์ด ์๋ ์ ํต์ ๋ฐฉ์์ผ๋ก ์์์ ๊ตฌํํ๋ ๋ฒ์ ๋ํ ๊ธ์ด๋ค.
let pikachu = {
attack: 90,
defence: 50,
skillOne: 'toSlapYourFace',
skillTwo: 'lightning shock',
}
let raichu = { cuteness: 100, specialSkill: 'jungwangsukwha', canEvolve: true }
์ฌ๊ธฐ ํผ์นด์ธ์ ๋ผ์ด์ธ๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์์ฑ์ ์์์ ์ผ๋ก ๋ง๋ค์ด ์ฃผ์๋ค.
ํ์ฌ ๋ ๊ฐ์ฒด๋ ์๋ก ๋จ๋จ์ด๋ค. 1๋ ์๊ด์๋ ์ฌ์ด์ด๋ค.
์์ ๋ค์ ๋ํดํ ๋ฏํ ์์๋ฅผ ๋ค๊ธด ํ๋๋ฐ ์ฌ์ค,
let superObj = { superVal: 'super' } // === pikachu
let subObj = { subVal: 'sub' } // === raichu
๋ ๋๊ฐ์ ๋ฐฉ์์ด๋ค. ๋ ์ฌ๋ฐ๊ฒ ํด๋ณด๊ณ ์ถ์์ ๋ฟ..
์ฌํํผ ๋ ๊ฐ์ฒด๋ ์๋ก ๋จ๋จ์ธ ์ํ์ธ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์๋ Class ๋ฌธ๋ฒ์ด ์๋, ๊ฐ์ฒด๋ฅผ ์ง์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์์ผ๋ก ๋ง๋ค์ด ๋ฒ๋ฆด ์๊ฐ ์๋ค.
์ด๋ป๊ฒ?
๋ฐ๋ก ๋ผ์ด์ธ์ ์ํ์ด ๋ฌด์์ธ๊ฐ๋ฅผ ๊ฐ๋ฆฌํค๋ (๋ผ์ด์ธ์ ์ํ์ ํผ์นด์ธ ใ ใ ..๐ฅฐ)
prototype link ๋ฅผ ์ ํด์ฃผ๋ฉด ๋๋ค.
raichu.__proto__ = pikachu;
{attack: 90, defence: 50, skillOne: "toSlapYourFace", skillTwo: "lightning shock"}
raichu.cuteness
100
raichu.specialSkill
"jungwangsukwha"
raichu.canEvolve
true
๋น์ฐ ๋ผ์ด์ธ์ ๊ธฐ๋ณธ ์์ฑ์ ์ ํํ๋ฉด ์๊ธฐ๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ์ด๋ฏ๋ก ๊ณ ๋๋ก ๋์จ๋ค.
๊ทผ๋ฐ ๋ง์ฝ ๋ผ์ด์ธ.์คํฌOne ์ฒซ๋ฒ์งธ ์ด๋ ๊ฒ ํ๋ฉด ๋ญ๊ฐ ๋์ฌ๊น? ๋ผ์ด์ธ์ ์์ฑ์ ์คํฌOne ์ด ์์ด์ ์๋ฌด๊ฒ๋ ์๋์ฌ๊น?
raichu.skillOne
;('toSlapYourFace')
raichu.skillTwo
;('lightning shock')
ํผ์นด์ธ (์ํ๊ฐ์ฒด) ์ ์ธ๋๊ธฐ ์คํฌ์ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ์๋ค!
๋ผ์ด์ธ์ ์์ฑ์๋ skillOne, skillTwo ์ ์๊ฐ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ์คํฌ์ ๋ฌผ๋ ค๋ฐ์๋ค!
raichu.__proto__ = pikachu
์ธ๋๋ฐ proto ๋งํฌ๋ฅผ ํตํด ๋ผ์ด์ธ๊ฐ ํผ์นด์ธ์ ์์์ด๋ค. ํผ์นด์ธ์ ์์ฑ์ ๋ชจ๋ ๋ฌผ๋ ค๋ฐ๋๋ค ๋ผ๊ณ ๋งํฌ๋ฅผ ๊ฑธ์ด์ค๊ฑฐ๋ค.
์๋ ์๋ฆฌ๋ Javascript ์์๋ ์ฐ์ ์ ์ผ๋ก ๋ผ์ด์ธ์์ ์คํฌ์๊ณผ ์คํฌํฌ ์์ฑ์ ๊ฐ๊ณ ์๋์ง ๋จผ์ ์ฐพ๊ฒ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์๋ค. ๊ทธ๋ฌ๋ฉด ์ธ๋๋ฐ proto ๋ผ๋ ์์ฑ์ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ (ํผ์นด์ธ) ๋ค์ด๊ฐ์ ์คํฌ์๊ณผ ์คํฌํฌ ์์ฑ์ ์ฐพ๋๋ค.
์๋ค!
๊ทธ๋ผ ์ด๋ค! ๋ผ์ด์ธ๋ ํผ์นด์ธ์ ์์ฑ์ ๋ฌผ๋ ค๋ฐ๋๋ค!
ํผ์นด์ธ์ ๊ณต๊ฒฉ๋ ฅ์ ํ์ฌ attack : 90 ์ด๋ค.
ํผ์นด์ธ์ ๊ณต๊ฒฉ๋ ฅ๋ ๋ผ์ด์ธ๊ฐ ์์๋ฐ์์ผ๋ฏ๋ก,
raichu.attack
90
๋ช ์์ด ๋ผ์ด์ธ์ธ๋ฐ ๊ณต๊ฒฉ๋ ฅ์ด ํ ๋๋ฐฐ๋ ๋์ด์ผ์ง ์๊ฒ ๋.
๋ฐ๊ฟ๋ณด์.
raichu.attack = 180
180
์ฌ๊ธฐ์ ์๋ฌธ์ด ๋๋๊ฑฐ๋ค. ์ด๋ผ ๋ผ์ด์ธ ๊ณต๊ฒฉ๋ ฅ ๋ฐ๊ฟจ๋๋ฐ.. ํผ์นด์ธ ๊ณต๊ฒฉ๋ ฅ๋ ๋ฐ๋๋์?
๋ต์ ์๋.
pikachu.attack
90
ํผ์นด์ธ์ ๊ณต๊ฒฉ๋ ฅ์ ์ฌ์ ํ ๋๊ฐ๋ค.
์ฆ, ๋ผ์ด์ธ์ (์์ ๊ฐ์ฒด ๋ด ์์์) ๊ฐ์ ๋ฐ๊ฟจ์ ๋ฟ __proto__๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฐ์ฒด์ (ํผ์นด์ธ) ๊ฐ์ ๊ฐ๋ฆฌํค๋๊ฒ ์๋๋ค.
ํผ์นด์ธ ๊ฐ์ฒด์ proto ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ ์๋๋ค.
__proto__ ๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด์ ์์์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์์๋ค.
raichu.__proto__ = pikachu;
{attack: 90, defence: 50, skillOne: "toSlapYourFace", skillTwo: "lightning shock"}
raichu.cuteness
100
raichu.specialSkill
"jungwangsukwha"
raichu.canEvolve
true
์ฅ์ ์ ์ ์ฐํจ, ๋จ์ ์ ์ฌ๊ณ ํน์ ๋ณต์ก์ฑ์ ์ผ๊ธฐํ๋ค๊ณ ํ๋ค. (์ผ๋จ ๋์ด๊ฐ์)
์๋ฐ์คํฌ๋ฆฝํธ ํ์ค์์๋ __proto__ ๋ฅผ ์ธ์ ํ๊ณ ์์ง ์๋ค๊ณ ํ๋ค.
ํ์ง๋ง ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ํน์ javascript ์์คํ ๋ค์ด __proto__๋ฅผ ์ค์ ๋ก ๊ตฌํํด์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์์ ํ์ค์ธ ์ ์ด๋ผ ํ๋ค.
ํ์ง๋ง ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์์ ๋ฐ๋ ๊ฒ์ ์ ์์ด ์๋๋ผ๊ณ ํ๋ค.