๐ก Javascript๋ ํ๋กํ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ธ์ด๋ค. ๋ณดํต ๊ฐ์ฒด์งํฅ์ธ์ด๋ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ธ์ด์ธ๋ฐ ํน์ดํ๊ฒ๋ Javascript๋ ๊ฐ์ฒด์งํฅ ์ธ์ด์ด์ง๋ง ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์๋๋ค.
๊ฐ์ฒด๋ฅผ ์ํ์ผ๋ก ํ๋ Prototype์ ์ด๋ฅผ ์ด์ฉํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋๊ฐ ์ ์๋๋ก ํ๋ค.
๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ํ์ฅํ์ฌ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋๋ก ํ๋ค.
Javascript์์ ํจ์๋ฅผ ์ ์ํ๋ฉด ๋์์ ํด๋น ํจ์์ Prototype Object๋ ๋์์ ์์ฑ๋๋ค.
์ฌ๋์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฅ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ฒ๋ผ ํจ์ ๋ด๋ถ์๋ prototype์ด๋ผ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ฒ๋๋ค.
์ด prototype์ Prototype Object๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
Prototype Object๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉค๋ฒ ๋ณ์๋ก constructor์ Prototype Link๋ผ๋ __proto__
๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฌ๊ธฐ์ constructor ์์ฑ์ ํจ์๋ฅผ ์ฐธ์กฐํ๋ค.
โญ๏ธ Prototype object๋ฅผ ์ฐธ์กฐํ๋ prototype์ new๋ผ๋ ์ฐ์ฐ์์ ํด๋น ํจ์๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด์ ์ํ์ด ๋๋ ๊ฐ์ฒด๋ค.
๋ชจ๋ ๊ฐ์ฒด๋ค์__proto__
์์ฑ์ ๊ฐ์ง๊ณ ์์ด์ ๋๋ถ์ ํจ์์ ์ง์ ์ฐ๊ฒฐํ์ง ์๊ณ ๋ ํจ์์ prototype ๊ฐ์ฒด๋ฅผ ์์๋ณด๊ณ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒ์ด๋ค.
new ์์ฑ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ์์ฑ๋๊ธฐ ์ํด ์ฌ์ฉ๋ ์ํ์ธ Prototype Object๋ฅผ ๊ฐ๋ฆฌํค๋ __proto__
๋ผ๋ ์จ๊ฒจ์ง ๋งํฌ๋ก ์ฐธ์กฐํ๊ณ ์๋ค.
์ดํด๋ฅผ ์ํด ์ค๋ฆฌ ์ด์ผ๊ธฐ๐ฅ๋ฅผ ๊ฐ์ง๊ณ ์๋ดค๋ค...
๐์ค๋ฆฌ๋ ํจ์๋ฅผ ์ ์ํ์ฌ ๐ฅA, ๐ฅB, ๐ฅC๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
function Duck() {
this.hair = 3;
this.eyes = 2;
this.body = 1;
this.foot = 2;
}
const duckA = new Duck();
const duckB = new Duck();
const duckC = new Duck();
โ ํ์ง๋ง ์ด๋ ๊ฒ ํจ์ ์์์ ์ ์ธํด์ฃผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์๋ ์ด 9๊ฐ๊ฐ ์์ด๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ prototype์ ์ฌ์ฉํ ์ ์๋ค.
function Duck() {}
Duck.prototype.hair = 3;
Duck.prototype.eyes = 2;
Duck.prototype.body = 1;
Duck.prototype.foot = 2;
Duck.prototype.getType() = function () {
return '์์์ค๋ฆฌ';
}
const duckA = new Duck();
const duckB = new Duck();
const duckC = new Duck();
๋ค์์ฒ๋ผ Duck์ด๋ผ๋ ํจ์์ Prototype Object์ ๋ฉค๋ฒ ๋ณ์๋ก eyes, body, foot ๊ทธ๋ฆฌ๊ณ getType()์ ์ถ๊ฐํ ์ ์๋ค.
๋ง์ฝ duckA์ ์ด์ฉํด์ getType()์ return ๊ฐ์ ์์ ํ๋ค๋ฉด, ๋ฉค๋ฒ๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ํด๋น ๊ฐ์ฒด(duck A)์ ๋ฉค๋ฒ๋ก ์ถ๊ฐํ ์ ์๋ค.
...
duckA.prototype.getType() = function () {
return '๋ชป๋์ค๋ฆฌ';
}
์์ ์ค๋ฆฌ ์ด์ผ๊ธฐ์์ duckA ๊ฐ์ฒด์์ getType()์ด๋ผ๋ ํจ์๋ฅผ ์ฐพ์ ๋ duckA์ __proto__
๋ผ๋ Prototype link๋ฅผ ํตํด์ Duck Prototype Object์ ์๋ getType๋ฅผ ์ฐพ์์ ํธ์ถํ๋ค.
๊ทธ๋ฐ๋ฐ, ๋ง์ฝ์ Duck Prototype Object์ getType()๋ผ๋ ํจ์๊ฐ ์๋ค๋ฉด? __proto__
๋ก ์์ ์์์ ๋ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ํ๊ณ ์ฌ๋ผ๊ฐ๋ค๋ณด๋ฉด ๊ฐ์ฅ ์ต์๋จ์ Object Prototype์ ๋๋ฌํ๊ฒ ๋๋ค.
Object prototype์์ ์์๋ ๋ฉ์๋ ์ค์ getType๊ฐ ์๋ค๋ฉด ์ฐพ์์ ํธ์ถํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ์ ์ธ๋ ๊ฐ์ฒด์์ Prototype link๋ฅผ ์ด์ฉํด ์์ ๊ฐ์ฒด๋ก ๋ณ์ ๋๋ ํจ์๋ฅผ ํ์ํด๋๊ฐ๋ ๊ณผ์ ์ Prototype Chaining์ด๋ผ๊ณ ํ๋ค.