๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฐ ์–ธ์–ด/JS - ๋น„๊ธฐ๋„ˆ ํŽธ

์˜ค๋ธŒ์ ํŠธ ํ”„๋กœํ† ํƒ€์ž…

JavaScript : ํ”„๋กœํ† ํƒ€์ž…์˜ ์ดํ•ด > 

MDN_Object Prototypes >

์ƒํ™œ์ฝ”๋”ฉ_prototype > 

 

 

JavaScript๋Š” ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌ(cloning)ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ด๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด๋Š” ๊ฐ์ฒด ์›ํ˜•์ธ ํ”„๋กœํ† ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

 

 

1. ํ•จ์ˆ˜์™€ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ์ดํ•ด

1) ํ•จ์ˆ˜ ์ •์˜

  • ํ•จ์ˆ˜ ๋ฉค๋ฒ„๋กœ prototype์†์„ฑ์ด ์žˆ๋‹ค. ์ด ์†์„ฑ์€ ๋‹ค๋ฅธ ๊ณณ์— ์ƒ์„ฑ๋œ ํ•จ์ˆ˜์ด๋ฆ„์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. 
  • ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„์ธ constructor์†์„ฑ์€ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
function Person(){}

 

2) Personํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ

 

  • Person ํ•จ์ˆ˜์˜ prototype์†์„ฑ์ด ์ฐธ์กฐํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” new๋ผ๋Š” ์—ฐ์‚ฐ์ž์™€ Personํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐ์ฒด์˜ ์›ํ˜•์ด ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ์›ํ˜• ๊ฐ์ฒด๋‚ด์— prototype์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์—†๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์•ˆ์—๋Š” proto(๋น„ํ‘œ์ค€) ์†์„ฑ์ด ์žˆ๋‹ค. proto ์†์„ฑ์€ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ์›ํ˜•์ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ˆจ์€ ๋งํฌ๋กœ ์ฐธ์กฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

function Person(){}

# ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ 
var joon = new Person(); 
var jisoo = new Person();

 

 

2. ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์œ„ํ•œ ์›ํ˜•์ด ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ๊ฐ™์€ ์›ํ˜•์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

  • ๊ฐ™์€ ์›ํ˜•์„ ๋ณต์‚ฌ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ถ”๊ฐ€๋œ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
# ํ•จ์ˆ˜ ์•ˆ์˜ prototype์†์„ฑ์„ ์ด์šฉํ•ด ๋ฉค๋ฒ„ ์ถ”๊ฐ€
Person.prototype.getType = function(){
    return "์ธ๊ฐ„";
};

console.log(joon.getType); //์ธ๊ฐ„
console.log(jisoo.getType); //์ธ๊ฐ„

  • ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ, ๊ฐ์ฒด ๋˜๋Š” ํ•จ์ˆ˜์˜ prototype์†์„ฑ์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ณ‰์— ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•  ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ์•ˆ์˜ prototype์†์„ฑ์„ ํ†ตํ•ด ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.
Person.prototype.getType = function(){
    return "์ธ๊ฐ„";
};

joon.getType = function(){
    return "์‚ฌ๋žŒ";
};

console.log(joon.getType); //์‚ฌ๋žŒ
console.log(jisoo.getType); //์ธ๊ฐ„

jisoo.age = 25;

console.log(joon.age); //undefined
console.log(jisoo.age); //25

joon๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ getType()์„ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ getType()์„ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, joon๊ฐ์ฒด์— ์ถ”๊ฐ€๋œ getType()์„ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

 

  • ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ฅผ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ๋Š” ๋ฉค๋ฒ„ ์ถ”๊ฐ€์™€ ๊ฐ™์ด ํ•จ์ˆ˜์˜ prototype์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•œ๋‹ค.
Person.prototype.getType = function(){
    return "์‚ฌ๋žŒ";
};

console.log(jisoo.getType()); //์‚ฌ๋žŒ

 

 

3. ํ”„๋กœํ† ํƒ€์ž…

ํ”„๋กœํ† ํƒ€์ž…์€ ํฌ๊ฒŒ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” prototype ์†์„ฑ๊ณผ ๊ฐ์ฒด ๋ฉค๋ฒ„์ธ proto ์†์„ฑ์ด ์ฐธ์กฐํ•˜๋Š” ์ˆจ์€ ๋งํฌ ๋‘๊ฐ€์ง€๋กœ ํ•ด์„๋œ๋‹ค.

  • ํ•จ์ˆ˜์˜ ๋ฉค๋ฒ„์ธ prototype ์†์„ฑ์€ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์†์„ฑ์ด๋‹ค. ํ•จ์ˆ˜์™€ new์—ฐ์‚ฐ์ž๊ฐ€ ๋งŒ๋‚˜ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ์•ˆ์˜ __proto__ ์†์„ฑ์€ ์ž์‹ ์„ ๋งŒ๋“ค์–ด๋‚ธ ์›ํ˜•์ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๋งํฌ๋กœ์จ ํ”„๋กœํ† ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์ˆจ๊ฒจ์ง„ ๋งํฌ๊ฐ€ ์žˆ์–ด ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

4. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

ํŠน์ • ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ณ ์žํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๋งํฌ([[Prototype]] ํ”„๋กœํผํ‹ฐ)๋ฅผ ๋”ฐ๋ผ ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ฐจ๋ก€๋กœ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์ด๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ผ ํ•œ๋‹ค.

function Ultra(){}
Ultra.prototype.ultraProp = true;

function Super(){}
Super.prototype = new Ultra();

function Sub(){}
Sub.prototype = new Super();

var o = new Sub();

console.log(o.ultraProp); //true

์œ„ ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ์ž Sub๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด o๊ฐ€ Ultra์˜ ํ”„๋กœํผํ‹ฐ ultraProp์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ prototype ์ฒด์ธ์œผ๋กœ Sub์™€ Ultra๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค.

  1. ๊ฐ์ฒด o์—์„œ ultraProp๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์—†๋‹ค๋ฉด Sub.prototype.ultraProp๋ฅผ ์ฐพ๋Š”๋‹ค.
  3. ์—†๋‹ค๋ฉด Super.prototype.ultraProp๋ฅผ ์ฐพ๋Š”๋‹ค.
  4. ์—†๋‹ค๋ฉด Ultra.prototype.ultraProp๋ฅผ ์ฐพ๋Š”๋‹ค.

prototype๋Š” ๊ฐ์ฒด์™€ ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ฒด์ธ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๋ฅผ prototype chain์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

โ€ป ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

1. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์ด์šฉ
var o = {};

2. new์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด ์ƒ์„ฑ
var o = new Sub();

1๋ฒˆ ๋ฐฉ๋ฒ•์€ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ 2๋ฒˆ ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง€๊ฒŒ ๋œ๋‹ค.