Prototype

ํ˜„์œ ์ง„ยท2021๋…„ 7์›” 24์ผ
0

๐Ÿ’ก Javascript๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์–ธ์–ด๋‹ค. ๋ณดํ†ต ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋Š” ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์–ธ์–ด์ธ๋ฐ ํŠน์ดํ•˜๊ฒŒ๋„ Javascript๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด์ง€๋งŒ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Prototype์ด๋ž€?

๊ฐ์ฒด๋ฅผ ์›ํ˜•์œผ๋กœ ํ•˜๋Š” 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 '๋ชป๋‚œ์˜ค๋ฆฌ';
}

Prototype Chaining

์œ„์˜ ์˜ค๋ฆฌ ์ด์•ผ๊ธฐ์—์„œ duckA ๊ฐ์ฒด์—์„œ getType()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ duckA์˜ __proto__๋ผ๋Š” Prototype link๋ฅผ ํ†ตํ•ด์„œ Duck Prototype Object์— ์žˆ๋Š” getType๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ์— Duck Prototype Object์— getType()๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด? __proto__๋กœ ์ƒ์† ์ˆœ์„œ์— ๋”ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋‹ค๋ณด๋ฉด ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์— Object Prototype์— ๋„๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

Object prototype์—์„œ ์ƒ์†๋œ ๋ฉ”์†Œ๋“œ ์ค‘์— getType๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฐพ์•„์„œ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ ์–ธ๋œ ๊ฐ์ฒด์—์„œ Prototype link๋ฅผ ์ด์šฉํ•ด ์ƒ์œ„ ๊ฐ์ฒด๋กœ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ๊ณผ์ • ์„ Prototype Chaining์ด๋ผ๊ณ  ํ•œ๋‹ค.

profile
WEB FE Developer

0๊ฐœ์˜ ๋Œ“๊ธ€