Prototype Pattern

JavaScript ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์˜๋ฏธ

๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํŒจํ„ด์ด๋‹ค.

JavaScript Prototype

JavaScript์—์„œ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค. (ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด์œ ์ด๋‹ค.) ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ํด๋ž˜์Šค๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๋” ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋ฌธ์  ์„คํƒ•(syntactic sugar) ์—ญํ• ์„ ํ•  ๋ฟ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ธฐ์กด ๊ฐ์ฒด์˜ ์†์„ฑ์€ ๊ฐ์ฒด ์ƒ์„ฑ์ž์˜ prototype ํ”„๋กœํผํ‹ฐ์— ์ •์˜๋œ๋‹ค. Object.getPrototypeOf(), Object.setPrototypeOf() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด prototype์„ ์กฐํšŒยท๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Prototype Chain

๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์— ๊ทธ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—์„œ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์ด๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ•˜๋Š”๋ฐ, ์•„๋ž˜๋Š” Object.create()๋กœ ์ƒ์„ฑํ•œ ์˜ˆ์‹œ์ด๋‹ค.

const dog = {
  bark() {
    console.log(`๋ฉ๋ฉ!`);
  },
};

const myPet = Object.create(dog);

myPet.bark(); // โ†’ ๋ฉ๋ฉ!

console.log(Object.keys(myPet)); // โ†’ []
console.log(Object.keys(Object.getPrototypeOf(myPet))); // โ†’ ['bark']

์žฅ์ 

  • ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ๋Œ€์ƒ ๊ฐ์ฒด์— ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ง์ ‘ ์„ ์–ธ๋˜์–ด์žˆ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

์‹ค์ œ๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ Object.prototype์„ ์ˆ˜์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ๋”ฐ์œ„ ์ฐฝ๋ฌธ๋ฐ–์œผ๋กœ ๋˜์ ธ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ํ•˜์ง€๋งˆ์„ธ์š”! - JavaScript engine fundamentals: optimizing prototypes

์ฐธ๊ณ  ์ž๋ฃŒ

Last updated