18. prototype

์ด์ˆ˜ํ˜„ยท2022๋…„ 5์›” 19์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
17/23

๐Ÿ“š prototype

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Prototype๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด์—์„œ๋Š” ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€๋งŒPrototype๊ธฐ๋ฐ˜ ์–ธ์–ด์—์„œ๋Š” ์–ด๋–ค ๊ฐ์ฒด๋ฅผ Prototype์œผ๋กœ ์‚ผ๊ณ  ์ด๋ฅผ ๋ณต์ œํ•จ์œผ๋กœ์จ ์ƒ์†๊ณผ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

  • ์–ด๋–ค Class๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด, Class์˜ constructor๋‚˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ด๋•Œ ์ธ์Šคํ„ด์Šค์—๋Š” __proto__๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ถ€์—ฌ๋˜๋Š”๋ฐ, ์ด ํ”„๋กœํผํ‹ฐ๋Š” Constructor์˜ prototype์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

=> prototype๊ณผ __proto__๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒˆ๋กœ ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, ์ด ๋‘˜์˜ ๊ด€๊ณ„๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋…์˜ ํ•ต์‹ฌ์ด๋‹ค.

prototype์€ ๊ฐ์ฒด์ด๋‹ค. ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” __proto__ ์—ญ์‹œ ๋‹น์—ฐํžˆ ๊ฐ์ฒด์ด๋‹ค.
prototype ๊ฐ์ฒด ๋‚ด๋ถ€์—๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์ธ์Šคํ„ด์Šค์—์„œ๋„ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ์ธ __proto__์„ ํ†ตํ•ด ์ด ๋ฉ”์„œ๋“œ๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

let Person = function (name) {
  this.name = name;
};

Person.prototype.getName = function () {
  return this.name;
};

let su = new Person("kiki");
console.log(su.__proto__.getName()); // undefined
console.log(su.getName()); // kiki
console.log(Person.prototype === su.__proto__); // true

class Animal {
  constructor(age) {
    this.age = age;
  }
}

Animal.prototype.getAge = function () {
  return this.age;
};

let an = new Animal(12);
console.log(an.__proto__.getAge()); // undefined
console.log(an.getAge()); // 12
console.log(Animal.prototype === an.__proto__); // true
  1. ์™œ instance.__proto__.๋ฉ”์„œ๋“œ() ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ undefined๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž

  2. ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ "๋ฉ”์„œ๋“œ"๋กœ์„œ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๋ฉ”์„œ๋“œ๋ช… ๋ฐ”๋กœ ์•ž์˜ ๊ฐ์ฒด๊ฐ€ this๊ฐ€ ๋œ๋‹ค.

  3. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ su.__proto__.getName()์—์„œ getName() ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this๋Š” su๊ฐ€ ์•„๋‹ˆ๋ผ su.__proto__๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  4. su.__proto__ ๊ฐ์ฒด ๋‚ด๋ถ€์—๋Š” name ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. su.__proto__.name = "kiki__proto__"; ๋กœ name ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด, console.log(su.__proto__.getName()); ์ถœ๋ ฅ๊ฐ’์œผ๋กœ "kiki__proto__"๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

  6. ๊ด€๊ฑด์€ "this"์ด๋‹ค.

  7. ์ธ์Šคํ„ด์Šค ์ž์ฒด๊ฐ€ this๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์—์„œ su.getAge()๋ฅผ ์ถœ๋ ฅํ–ˆ๋”๋‹ˆ "kiki"๊ฐ€ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  8. ๋ฉ”์„œ๋“œ ์•ž์˜ ๊ฐ์ฒด๊ฐ€ su๋ผ๋Š” ์ธ์Šคํ„ด์Šค ์ž์ฒด์ด๋ฏ€๋กœ "kiki"๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค.

  9. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ƒ์„ฑ์ž.prototype์— getName์„ ์ •์˜ํ•˜์˜€๋Š”๋ฐ ์–ด๋–ป๊ฒŒ prototype์„ ์ฐธ์กฐํ•˜๋Š” __proto__ ๋ฅผ ์ƒ๋žตํ•ด์„œ su.getName()์„ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋‚˜์˜ฌ๊นŒ?.

  10. ์ด๊ฒƒ์€ ์• ์ดˆ์— __proto__๊ฐ€ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์›๋ž˜๋ถ€ํ„ฐ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ •์˜๋ผ ์žˆ๋‹ค.

  11. ์ฆ‰, su.getName()์€ su(.__proto__).getName()์ด๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค.

  12. __proto__๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š์œผ๋ฉด this๋Š” su.__proto__๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, ์ƒ๋žตํ•˜๋ฉด su๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์œ„ ์ฝ”๋“œ ์š”์•ฝ:

ํ•œ ๋งˆ๋””๋กœ this๊ฐ€ ๊ด€๊ฑด์ด๋‹ค. su.__proto__๋Š” Person.prototype์„ ์ฐธ์กฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ getName()์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฐ๋ฐ su.__proto__.getName()์„ ํ•˜๋ฉด su.__proto__ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ์˜ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š”๋ฐ su.__proto__๋Š” name ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ undefined ์ถœ๋ ฅ๋œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด getName()์„ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ์ฒด๊ฐ€ su๊ฐ€ ๋ผ์•ผ "kiki"๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.
prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” __proto_๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ž˜์„œ su.getName()์ด ๋ฐ”๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.
์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด su๋ฅผ ์ž…๋ ฅํ•ด๋„ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•œ ์ค„ ์š”์•ฝ: new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด -> ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ธ์Šคํ„ด์Šค์˜ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ์ธ __proto__๋Š” ์ƒ์„ฑ์ž์˜ prototype์„ ์ฐธ์กฐํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜์— ์ž๋™์œผ๋กœ ๊ฐ์ฒด์ธ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•ด ๋†“๋Š”๋ฐ, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ(new ์—ฐ์‚ฐ์ž ํ˜ธ์ถœ), ๊ทธ๋Ÿฌ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์—๋Š” ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ __proto__๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
์ด ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‚˜ class์˜ prototype์— ์–ด๋–ค ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค์—์„œ๋„ ๋งˆ์น˜ ์ž์‹ ์˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ณ„์† ๋ฐ˜๋ณต๋˜๋Š” ์–˜๊ธฐ๋ฅผ ํ•˜๋Š”๋ฐ, ๊ทธ ๋งŒํผ ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ฐœ๋…์„ ํ•œ ๋ฒˆ์— ์ดํ•ด ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค...




์ฐธ๊ณ  ์ž๋ฃŒ :

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes
https://ko.javascript.info/prototypes
[์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ์ •์žฌ๋‚จ]

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