์ƒˆ์†Œ์‹

Languages/Java Script

[Js] prototype | ์ƒ์† | javascript ์ƒ์†

  • -
๋ฐ˜์‘ํ˜•

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ "์ƒํ™œ์ฝ”๋”ฉ"์˜ ์ด๊ณ ์ž‰ ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ฌ๋ฆฐ ๊ฒŒ์‹œ๊ธ€ ์ž…๋‹ˆ๋‹ค.

์ƒ์—…์ ์ธ ์šฉ๋„๊ฐ€ ์•„๋‹Œ, ๊ฐœ์ธ ๊ณต๋ถ€ ์ •๋ฆฌ ๋ชฉ์ ์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ž„์„ ๋ฏธ๋ฆฌ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 


์ด๋ฒˆ ์ˆ˜์—…์€ ์ƒ์†์ˆ˜์—…์˜ ์—ฐ์žฅ์„ ์ƒ์— ์žˆ๋‹ค. ์ƒ์†์˜ ๊ตฌ์ฒด์ ์ธ ์ˆ˜๋‹จ์ธ prototype์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 

prototype์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด์ง€ํ–ฅ์„ ์ง€ํƒฑํ•˜๊ณ  ์žˆ๋Š” ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋…์ด๋ฉฐ, ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์™€ ๊ตฌ๋ถ„ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

prototype

ํ•œ๊ตญ์–ด๋กœ๋Š” ์›ํ˜•์ •๋„๋กœ ๋ฒˆ์—ญ๋˜๋Š” prototype์€ ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด์˜ ์›ํ˜•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋  ํ•จ์ˆ˜๋„ ๊ฐ์ฒด๋‹ค.

 

๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ prototype์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ๊ทธ ์šฉ๋„๊ฐ€ ์•ฝ์†๋˜์–ด ์žˆ๋Š” ํŠน์ˆ˜ํ•œ ํ”„๋กœํผํ‹ฐ๋‹ค.

prototype์— ์ €์žฅ๋œ ์†์„ฑ๋“ค์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ๊ทธ ๊ฐ์ฒด์— ์—ฐ๊ฒฐ๋œ๋‹ค. 

 

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

<script>
    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);
</script>

์œ„์˜ ๊ฒฐ๊ณผ๋Š” true์ด๋‹ค.

 

์œ„ ์ฝ”๋“œ๋กœ ๋ณด์ž๋ฉด ๊ฐ€์žฅ ํฐ ์ตœ์ƒ์œ„ ๊ฐ์ฒด(๋ฌผ๋ก  ๋” ํฐ ๊ฐœ๋…์ด ์กด์žฌํ•จ.) Ultra๋ฅผ ์ƒ์†๋ฐ›๋Š” Super๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ sub์ธ ๊ฒƒ์ด๋‹ค.

 

sub์— ์ •์˜๋˜์ง€ ์•Š์€ ultraProp๋ผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ "prototype" ๋•๋ถ„์ธ ๊ฒƒ์ด๋‹ค.

 

sub๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๊ณ , ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํผํ‹ฐ(์†์„ฑ)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ์˜ ์ข…๋ฅ˜ ์ค‘, prototype์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๊ณ  ๋‹น์—ฐํžˆ ๊ฐ์ฒด์ธ sub๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์œ„ ์‚ฌ์ง„์„ ๋ณด์ž. ๋จผ์ € function func(){}๋กœ  func๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  ์ด๋ฅผ ๋ณด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋“ค์–ด๊ฐ„ ๊ฐ’์ด ์—†๋‹ค.

func์˜ ์†์„ฑ์ธ prototype์„ ๋ณด๋ฉด func {} ๋ผ๋Š” ๊ฐ์ฒด๋ผ ์ถœ๋ ฅ๋œ๋‹ค.

new  Object()๋ผ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด ์ด ๋˜ํ•œ ๊ฐ์ฒด๋กœ ์ •์˜ ๋œ๋‹ค.

 

๋‹ค์‹œ, func์— ํ”„๋กœํ† ํƒ€์ž…์— ์†์„ฑ์œผ๋กœ name์„ ์ฃผ๊ณ , ์ด๋ฆ„์„ 'egoing'์ด๋ผ๊ณ  ์ž…๋ ฅํ•œ๋‹ค๋ฉด egoing ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

 

var o ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  new func() ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ func๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ๊ฐ’์„ o์— ๋„ฃ๋Š”๋‹ค๋ฉด

๋ณ€์ˆ˜ o ์•ˆ์—๋Š” name : egoing , ์ฆ‰ ์›๋ž˜ prototype์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์ด ๋ฆฌํ„ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ฐ์ฒด๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฅดํ‚ค๊ณ , ๋˜ ๊ทธ๊ฒƒ์ด ๊ฐ์ฒด์™€ ์—ฐ๊ฒฐ -> ํ”„๋กœํ†  ํƒ€์ž… ... ์ด๋ ‡๊ฒŒ ์œ„์™€๊ฐ™์ด prototype์ด ์ฒด์ธ์„ ์ด๋ฃจ๋Š” ํ˜•ํƒœ๋ฅผ "prototype chain"์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

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

 

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

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

 

 

 

โ€ป ์ฃผ์˜!!

Super.prototype = Ultra.prototype ์œผ๋กœํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
์ด๋ ‡๊ฒŒํ•˜๋ฉด Super.prototype์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ทธ๊ฒƒ์ด Ultra.prototype๋„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
Super.prototype = new Ultra();๋Š” Ultra.prototype์˜ ์›ํ˜•์œผ๋กœ ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— new Ultra()๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒจ๋„ Ultra.prototype์˜ ๊ฐ์ฒด์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

 

๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ดํ•ดํ•œ ๊ฒƒ.

๋”๋ณด๊ธฐ

์ƒ์„ฑ์ž = ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ž„. ์ฆ‰ new Object๋ผ๊ณ  ํ•˜๋ฉด Object {} ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ.

๊ทธ๋ ‡๋‹ค๋ฉด function Object(){} ์™€ ๊ฐ™์ง€ ์•Š์„๊นŒ?? 

-> x 

ํ•จ์ˆ˜๋Š” ์ •์˜ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฐ์ฒด๋กœ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด ์•„๋‹˜. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ์ถœ๋ ฅํ•ด๋ณด๋ฉด

defined ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ function Object(){} ์„ ํ•ด์ค€๋’ค Object.prototype์„ ํ•ด์ฃผ๋ฉด new Object๋ฅผ ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๊ฐ€ ๋‚˜๋Š”๋ฐ,

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ ์›ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ์‹ค์ œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ, ๊ทธ ๊ฐ’์„ ๋˜‘๊ฐ™์ด ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.