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

[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Prototype

by soy๋ฏธ๋‹ˆ 2021. 9. 30.

 

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” ๋Œ€์‹  ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์€ ๋ฌด์—‡์ผ๊นŒ?

 

 

๐Ÿ’ก Prototype

 

  • ํ”„๋กœํ† ํƒ€์ž…์—์„œ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํ† ํƒ€์ž…์— new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐ์ฒด(ํ•จ์ˆ˜)๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ• ๊นŒ?

 

function f1(){
    return{
        a: 10,
        f: function(){}
    }
}
let obj1 = f1();
let obj2 = f1();
console.log(obj1.f === obj2.f);

//false

 

  • ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ obj1๊ณผ obj2 ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ์ถœ๋ ฅ๋œ๋‹ค.
  • obj1๊ณผ obj2 ๋Š” ๋ชจ๋‘ f1 ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒƒ์€ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ด๋‹ค. ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค. 

 

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ์™œ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ๊นŒ?

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒ์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ์ž๋ฐ”์—์„œ new๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ์—์„œ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ๊ทธ๋Ÿฐ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

// ํ”„๋กœํ† ํƒ€์ž…
function F2(){
    this.a = 10
}
let ins1 = new F2();
let ins2 = new F2();
F2.prototype.f = function(){};
console.log(ins1.f === ins2.f);

// true

 

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ F2()๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ”„๋กœํ† ํƒ€์ž…์„ ์ด์šฉํ•ด์„œ F2() ์— ํ”„๋กœํผํ‹ฐ f ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • f ์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

let obj = function f1(){}
obj.f1 = function(){
    console.log(1);
}
obj.f1();
function F1(){
}
F1.prototype.f1 = function(){
    console.log(2);
}
let ins = new F1();
ins.f1();

// 1
// 2

 

  • F1() ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  prototype ์œผ๋กœ ํ•จ์ˆ˜ F1 ์— ์š”์†Œ f1์„ ๋งŒ๋“ ๋‹ค.
  • ins ์— F1 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  f1์„ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

 

 

 

์˜ˆ์ œ

 

// output() ์œผ๋กœ ์‹คํ–‰์ด ๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ
function makeInfo(name, n1, n2) {
    this.name = name,
        this.n1 = n1,
        this.n2 = n2
}

let ar = [];
ar.push(new makeInfo('ํ˜ธ๋ž‘์ด0', 10, 60));
ar.push(new makeInfo('ํ˜ธ๋ž‘์ด1', 20, 70));
ar.push(new makeInfo('ํ˜ธ๋ž‘์ด2', 30, 80));
ar.push(new makeInfo('ํ˜ธ๋ž‘์ด3', 40, 90));
ar.push(new makeInfo('ํ˜ธ๋ž‘์ด4', 50, 10));

ar.forEach((v, i) => {
    ar[i].sum = v.n1 + v.n2;
})

for (let index in ar) {
    ar[index].output();
}

 

  • output() ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

// output() ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
makeInfo.prototype.output = function () {
    console.log(this.name, this.n1, this.n2, this.sum);
}

 

  • ar[index] ๊ฐ€ for ๋ฌธ์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ ‘๊ทผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ index ๋ฅผ ์–ด๋–ป๊ฒŒ output ํ”„๋กœํผํ‹ฐ์— ์ „๋‹ฌํ• ์ง€๊ฐ€ ๊ณ ๋ฏผ์ด์—ˆ๋Š”๋ฐ this ๋ฅผ ์‚ฌ์šฉํ•ด์„œ output ๋‚ด์—์„œ ์Šค์Šค๋กœ ํ˜„์žฌ index ๋ฅผ ์ฐพ๋„๋ก ํ–ˆ๋‹ค.
  • output ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑํ•˜๊ณ  this ๋กœ index ์— ๋งž๋Š” ๋ณ€์ˆ˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

๋Œ“๊ธ€