ํด๋น ํฌ์คํ
์ "์ํ์ฝ๋ฉ"์ ์ด๊ณ ์ ๋์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฆฐ ๊ฒ์๊ธ ์
๋๋ค.
์์
์ ์ธ ์ฉ๋๊ฐ ์๋, ๊ฐ์ธ ๊ณต๋ถ ์ ๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ธ์์ ๋ฏธ๋ฆฌ ์๋ฆฝ๋๋ค.
์ด๋ฒ ์์
์ ์์์์
์ ์ฐ์ฅ์ ์์ ์๋ค. ์์์ ๊ตฌ์ฒด์ ์ธ ์๋จ์ธ prototype์ ๋ํด์ ์์ธํ ์์๋ณด์.
prototype์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์งํฅ์ ์งํฑํ๊ณ ์๋ ํต์ฌ์ ์ธ ๊ฐ๋
์ด๋ฉฐ, ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์งํฅ ์ธ์ด์ ๊ตฌ๋ถํ๋ ์ค์ํ ๊ฐ๋
์ด๋ผ๊ณ ํ ์ ์๋ค .
prototype
ํ๊ตญ์ด๋ก๋ ์ํ์ ๋๋ก ๋ฒ์ญ๋๋ prototype์ ๋ง ๊ทธ๋๋ก ๊ฐ์ฒด์ ์ํ์ด๋ผ๊ณ ํ ์ ์๋ค.
ํจ์๋ ๊ฐ์ฒด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ฑ์๋ก ์ฌ์ฉ๋ ํจ์๋ ๊ฐ์ฒด๋ค.
๊ฐ์ฒด๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ prototype์ด๋ผ๋ ํ๋กํผํฐ๋ ๊ทธ ์ฉ๋๊ฐ ์ฝ์๋์ด ์๋ ํน์ํ ํ๋กํผํฐ๋ค.
prototype์ ์ ์ฅ๋ ์์ฑ๋ค์ ์์ฑ์๋ฅผ ํตํด์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๋ ๊ทธ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋๋ค.
์๋ ์์๋ฅผ ์ดํด๋ณด์.
<script>
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);
</script>
์์ ๊ฒฐ๊ณผ๋ true์ด๋ค.
์ ์ฝ๋๋ก ๋ณด์๋ฉด ๊ฐ์ฅ ํฐ ์ต์์ ๊ฐ์ฒด(๋ฌผ๋ก ๋ ํฐ ๊ฐ๋
์ด ์กด์ฌํจ.) Ultra๋ฅผ ์์๋ฐ๋ Super๋ฅผ ์์๋ฐ๋ ๊ฒ์ด ๋ฐ๋ก sub์ธ ๊ฒ์ด๋ค.
sub์ ์ ์๋์ง ์์ ultraProp๋ผ๋ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ฐ๋ก "prototype" ๋๋ถ์ธ ๊ฒ์ด๋ค.
sub๋ผ๋ ํจ์๋ ๊ฐ์ฒด์ด๊ณ , ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ๋กํผํฐ(์์ฑ)๋ฅผ ๊ฐ์ง ์ ์๋ค.
ํ๋กํผํฐ์ ์ข
๋ฅ ์ค, prototype์ด๋ผ๋ ํ๋กํผํฐ๊ฐ ์๋ ๊ฒ์ด๊ณ ๋น์ฐํ ๊ฐ์ฒด์ธ sub๋ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
์ ์ฌ์ง์ ๋ณด์. ๋จผ์ function func(){}๋ก func๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ ์ด๋ฅผ ๋ณด๋ฉด ์๋ฌด๊ฒ๋ ๋ค์ด๊ฐ ๊ฐ์ด ์๋ค.
func์ ์์ฑ์ธ prototype์ ๋ณด๋ฉด func {} ๋ผ๋ ๊ฐ์ฒด๋ผ ์ถ๋ ฅ๋๋ค.
new Object()๋ผ๋ ์์ฑ์ ํจ์๋ฅผ ๋ง๋ค๋ฉด ์ด ๋ํ ๊ฐ์ฒด๋ก ์ ์ ๋๋ค.
๋ค์, func์ ํ๋กํ ํ์
์ ์์ฑ์ผ๋ก name์ ์ฃผ๊ณ , ์ด๋ฆ์ 'egoing'์ด๋ผ๊ณ ์
๋ ฅํ๋ค๋ฉด egoing ๊ฐ์ด ์ ์ฅ๋๋ค.
var o ๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ new func() ์ฆ, ์์ฑ์ ํจ์๋ก func๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๊ฐ์ o์ ๋ฃ๋๋ค๋ฉด
๋ณ์ o ์์๋ name : egoing , ์ฆ ์๋ prototype์ด ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ๋ฆฌํด ๋๋ ๊ฒ์ด๋ค.
๊ฐ์ฒด๊ฐ ํ๋กํ ํ์
์ ๊ฐ๋ฅดํค๊ณ , ๋ ๊ทธ๊ฒ์ด ๊ฐ์ฒด์ ์ฐ๊ฒฐ -> ํ๋กํ ํ์
... ์ด๋ ๊ฒ ์์๊ฐ์ด prototype์ด ์ฒด์ธ์ ์ด๋ฃจ๋ ํํ๋ฅผ "prototype chain"์ด๋ผ๊ณ ํ๋ค.
์์ฑ์ Sub๋ฅผ ํตํด์ ๋ง๋ค์ด์ง ๊ฐ์ฒด o๊ฐ Ultra์ ํ๋กํผํฐ ultraProp์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ prototype ์ฒด์ธ์ผ๋ก Sub์ Ultra๊ฐ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค.
๊ฐ์ฒด o์์ ultraProp๋ฅผ ์ฐพ๋๋ค.
์๋ค๋ฉด Sub.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
์๋ค๋ฉด Super.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
์๋ค๋ฉด Ultra.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
prototype๋ ๊ฐ์ฒด์ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ์ฒด์ธ์ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค.
โป ์ฃผ์!!
Super.prototype = Ultra.prototype ์ผ๋กํ๋ฉด ์๋๋ค. ์ด๋ ๊ฒํ๋ฉด Super.prototype์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๊ทธ๊ฒ์ด Ultra.prototype๋ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ด๋ค. Super.prototype = new Ultra();๋ Ultra.prototype์ ์ํ์ผ๋ก ํ๋ ๊ฐ์ฒด๊ฐ ์์ฑ ๋๊ธฐ ๋๋ฌธ์ new Ultra()๋ฅผ ํตํด์ ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ๋ณํ๊ฐ ์๊ฒจ๋ Ultra.prototype์ ๊ฐ์ฒด์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋ด๊ฐ ๋ฐ๋ก ์ดํดํ ๊ฒ.
๋๋ณด๊ธฐ
์์ฑ์ = ํจ์๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์. ์ฆ new Object๋ผ๊ณ ํ๋ฉด Object {} ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ.
๊ทธ๋ ๋ค๋ฉด function Object(){} ์ ๊ฐ์ง ์์๊น??
-> x
ํจ์๋ ์ ์ํ๋ค๊ณ ํด์ ๊ฐ์ฒด๋ก ๋ฐ๋ก ๋ง๋ค์ด ์ง๋ ๊ฒ์ด ์๋. ๊ทธ๋์ ํจ์๊ฐ ๊ฐ์ฒด๊ฐ ๋์๋์ง ์ถ๋ ฅํด๋ณด๋ฉด
defined ๊ฐ ์ถ๋ ฅ๋๋ค.
๊ทธ๋์ function Object(){} ์ ํด์ค๋ค Object.prototype์ ํด์ฃผ๋ฉด new Object๋ฅผ ํ ๊ฒ๊ณผ ์ ์ฌํ ํจ๊ณผ๊ฐ ๋๋๋ฐ,
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๊ฒ ๋๋ฉด ์์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ๊ฒ์ด๋ค.
์ฆ ์ํ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฏ๋ก, ๊ทธ ๊ฐ์ ๋๊ฐ์ด ๊ฐ์ง๋ ์๋ก์ด ์์ฑ์๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ค.