JavaScript

JavaScript ํ”„๋กœํ† ํƒ€์ž…๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

kohi โ˜• 2022. 10. 21. 22:29

 

๐Ÿง ํ”„๋กœํ† ํƒ€์ž…์ด๋ž€?


์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…(prototype)์ด๋ž€ ์›ํ˜•์ด๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋“ค์„ ์ƒ์† ๋ฐ›๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ์จ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๊ทธ ๊ฐ์ฒด์—๋Š” prototype์ด๋ผ๋Š” object๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. prototype์—๋Š” ๋‹ค์‹œ constructor๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

Person.prototype.sum = function(){}

 

  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ prototype์— ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์˜€์„ ๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Person์ด๋ผ๋Š” object ์•ˆ์— mitt, kim์ด ์žˆ๋Š” ๊ฒฝ์šฐ, mitt.sum()๊ณผ kim.sum() ๋‘˜ ๋‹ค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ธ์Šคํ„ด์Šค ๊ฐ์ฒด์˜ key์— ์ ‘๊ทผํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์— key๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์—์„œ key๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์—†๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋” ์ƒ์œ„์˜ ํ”„๋กœํ† ํƒ€์ž…์—์„œ ์ฐพ๋Š”๋‹ค. ์ด๊ฒƒ์„ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿง ํ”„๋กœํ† ํƒ€์ž…์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!


 

sort ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

 

 

์œ„์—์„œ arr๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑํ–ˆ์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” new Array()์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค. new ํ‚ค์›Œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•จ๊ป˜ ์“ฐ๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

new ์ƒ์„ฑ์žํ•จ์ˆ˜์ด๋ฆ„()์˜ ํ˜•์‹์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์ผํ•œ ๊ตฌ์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค arr๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—๊ฒŒ์„œ sort ๋ฉ”์„œ๋“œ ๋“ฑ์„ ์ƒ์† ๋ฐ›๋Š”๋‹ค. arr ๋ฐฐ์—ด ๊ฐ์ฒด์˜ ์›ํ˜•์€ Array์ด๋‹ค. ์ •ํ™•ํžˆ๋Š” Array == ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ Array๊ฐ€ ๊ฐ€์ง€๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ๋Š” ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์˜ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ƒ์† ๋ฐ›๋Š”๋‹ค.

 

 

์˜ˆ์ œ ์ฝ”๋“œ
const buzz = {
    flying: true,
};

const woody = Object.create(buzz);
console.log(woody.flying); // true

 

woody๋Š” buzz์™€ prototype์ด ๋งํฌ๋˜์—ˆ๋‹ค. woody ๋‚ด๋ถ€์—๋Š” flying์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์ง€๋งŒ ์—ฐ๊ฒฐ๋œ buzz์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐพ์•„ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

 

const buzz = {
    flying: true,
};

const woody = Object.create(buzz);
console.log(woody.flying); // true

for (let i in woody) {
    console.log(`${i}๋ฅผ ๋ฐœ๊ฒฌ!`); // flying๋ฅผ ๋ฐœ๊ฒฌ!
}

 

๐Ÿง Prototype Link VS Prototype Object


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” Prototype Link์™€ Prototype Object๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•˜๊ณ , ์ด ๋‘˜์„ ํ†ตํ‹€์–ด Prototype์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

Prototype Object
function Toy() {} // ํ•จ์ˆ˜
const personObject = new Person(); // ํ•จ์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

 

personObject ๊ฐ์ฒด๋Š” Person์ด๋ผ๋Š” ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ด๋‹ค. ์–ธ์ œ๋‚˜ ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘๋œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ๋Š” ๋‘ ๊ฐ€์ง€ ์ผ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง„๋‹ค.

  • ํ•ด๋‹น ํ•จ์ˆ˜์— Constructor(์ƒ์„ฑ์ž) ์ž๊ฒฉ ๋ถ€์—ฌ
  • ํ•ด๋‹น ํ•จ์ˆ˜์˜ Prototype Object ์ƒ์„ฑ ๋ฐ ์—ฐ๊ฒฐ

 

 

๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ํ•จ์ˆ˜๋Š” prototype์ด๋ผ๋Š” ์†์„ฑ์„ ํ†ตํ•ด Prototype Object์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Prototype Object๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์™€ ๊ฐ™์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ์†์„ฑ์œผ๋กœ constructor์™€ __proto__๋ฅผ ๊ฐ€์ง„๋‹ค.

 

 

constructor๋Š” Prototype Object์™€ ๊ฐ™์ด ์ƒ์„ฑ๋˜์—ˆ๋˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , [[Prototype]] = __proto__๋Š” Prototype Link์ด๋‹ค.

 

function Toys() {}
Toys.prototype.flying = true;
Toys.prototype.sleeping = false;

const buzz = new Toys();
const woody = new Toys();

console.log(woody.sleeping); // false

 

Prototype Link

 

Prototype ์†์„ฑ์€ ํ•จ์ˆ˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ proto ์†์„ฑ์€ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋น ์ง์—†์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์†์„ฑ์ด๋‹ค.

__proto__๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์กฐ์ƒ์ด์—ˆ๋˜ ํ•จ์ˆ˜์˜ Prototype Object๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. buzz๋Š” Toys ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜์—ˆ์œผ๋‹ˆ Toys ํ•จ์ˆ˜์˜ Prototype Object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿง Prototype Chain


  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผ ์‹œ ๊ฐ์ฒด ์ž์‹ ์˜ ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ __proto__๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋ฅผ ๋”ฐ๋ผ์„œ ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ํŠน์ • ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ ์ ‘๊ทผ ์‹œ ๋งŒ์•ฝ ํ˜„์žฌ ๊ฐ์ฒด์˜ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด __proto__๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋ฅผ ๋”ฐ๋ผ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋‹ค.
  • ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์˜ ์ข…์ ์€ Object.prototype์ด๋‹ค.
  • ํ•˜์œ„ ๊ฐ์ฒด๋Š” ์ƒ์œ„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์† ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณต์œ ํ•œ๋‹ค.
  • ํ•ด๋‹น ๊ฐ์ฒด์— ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ด๋‹์ด ์ผ์–ด๋‚œ๋‹ค.

 

 

์ƒ์† ๊ด€์ ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์œ ์ผํ•œ ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด๋ฟ์ด๋‹ค. ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” [[prototype]]์ด๋ผ๋Š” ์€๋‹‰ ์†์„ฑ์„ ๊ฐ€์ง€๋Š”๋ฐ ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๋˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ทธ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๋˜ํ•œ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด๊ฒƒ์ด ๋ฐ˜๋ณต๋œ๋‹ค. ๊ฒฐ๊ตญ null์„ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋๋‚œ๋‹ค. null์€ ๋” ์ด์ƒ์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ์—†๋‹ค๊ณ  ์ •์˜๋˜๋ฉฐ, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ข…์  ์—ญํ• ์„ ํ•œ๋‹ค.

 

๐Ÿง Reference


https://hanamon.kr/javascript-ํ”„๋กœํ† ํƒ€์ž…๊ณผ-ํ”„๋กœํ† ํƒ€์ž…์ฒด์ธ/

https://developer.mozilla.org/ko/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

https://mygumi.tistory.com/m/312

https://velog.io/@adam2/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-Prototype-์™„๋ฒฝ-์ •๋ฆฌ

https://velog.io/@turtle601/Prototype์ด๋ž€