๐Ÿฅซ ํ”„๋กœํ† ํƒ€์ž…๊ณผ Class in JS ๐Ÿฅซ

2020. 9. 9. 15:53ใ†์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๐Ÿฅ‘ prototype ์ด๋ž€?

 

ES6๋ฌธ๋ฒ• ์ด์ „์—๋Š” Java Script์—๋Š” class๊ฐ€ ์—†์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ prototype์„ ํ†ตํ•ด์„œ ์ด๋ฅผ ํ‰๋‚ด๋‚ด๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. prototype์—†์ด ํ•จ์ˆ˜์™€ new๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

function ํƒ•์ˆ˜์œก() {
  this.meat = pork;
  this.sauce = sour;
}

let '๊น€ํ”ผํƒ•' = new ํƒ•์ˆ˜์œก();
let '์˜ค๋ž˜๋œํƒ•์ˆ˜์œก' = new ํƒ•์ˆ˜์œก();

์ด๋ ‡๊ฒŒ ๊น€ํ”ผํƒ•๊ณผ ์˜ค๋ž˜๋œํƒ•์ˆ˜์œก์„ ๋งŒ๋“ ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— meat๊ณผ sauce๊ฐ€ ๊ฐ 2๊ฐœ์”ฉ 4๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ prototype์„ ํ†ตํ•ด์„œ ๋นˆ ๊ณต๊ฐ„์— ๋„ฃ๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ค ๋‹ด์•„๋‘๊ณ  ํƒ•์ˆ˜์œก๋ผ๋ฆฌ ๊ทธ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ์š”?

function ํƒ•์ˆ˜์œก() {
  ํƒ•์ˆ˜์œก.prototype.meat = pork;
  ํƒ•์ˆ˜์œก.prototype.sauce = sour;
}

let '๊น€ํ”ผํƒ•' = new ํƒ•์ˆ˜์œก();
let '์˜ค๋ž˜๋œํƒ•์ˆ˜์œก' = new ํƒ•์ˆ˜์œก();
let '์†Œ๊ณ ๊ธฐํƒ•์ˆ˜์œก' = new ํƒ•์ˆ˜์œก();
let '๊ฟ”๋ฐ”๋กœ์šฐ' = new ํƒ•์ˆ˜์œก();

//๋ช‡ ๊ฐœ๊ฐ€ ์˜ค๋“  ํƒ•์ˆ˜์œก์˜ meat๊ณผ sauce์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ง€๋Š” ๊ฐ™๋‹ค.

ํƒ•์ˆ˜์œก.prototype ์ด๋ผ๋Š” ๋นˆ ๊ฐ์ฒด๊ฐ€ ์žˆ์–ด์„œ ๊ทธ ๊ณณ์—๋‹ค ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํƒ•์ˆ˜์œก์„ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด๋„ ํƒ•์ˆ˜์œก๋“ค์˜ meat๊ณผ sauce์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ง€๊ฐ€ ๋Š˜์–ด๋‚˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. 

__prototype__ ์€ ํƒ€๊ฒŸ์˜ ์ƒ์œ„ ํ”„๋กœํ†  ํƒ€์ž…์˜ ์ฃผ์†Œ๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ

object.create( x.prototype) = > ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„ ํ”„๋กœํ† ํƒ€์ž…์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค! 
swallow copy ์™€ deep copy์˜ ์ฐจ์ด์ธ ์  ๊ธฐ์–ตํ•ด์ค˜!

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ OOP๊ฐ€ ๊ธฐ๋ณธ์ธ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ์— create์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ์นดํ”ผํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ 
XXX.prototype.constructor = XX ์œผ๋กœ ์„ค์ •์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.  -> ์ด๋Ÿฐ๊ฑธ ๋ชฝํ‚คํŒจ์น˜๋ผ๊ณ  ํ•œ๋‹ค. 
๋˜ ์ƒˆ๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์œ„์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•ด๋„ ์›๋ณธ์—์„œ์˜ this๊ฐ€ ์ธ์‹์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— XX.call( this, argument) ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

 

์ง€๊ธˆ์€ Class ๊ฐ€ ์žˆ์–ด์„œ ๊ดœ์ฐฎ๋‹ค. constructor๋กœ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  extends๋กœ ๊ธฐ์กด์— ์žˆ๋Š” class์— ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ super๋ฅผ ํ†ตํ•ด์„œ This๋ฅผ ์„ ํƒํ•ด์„œ ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์„ ๊ตฌ์—ฐํ•  ์ˆ˜ ์žˆ๋‹ค.   class ์—์„œ instance๋Š” this๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

๋ถ€๋ชจ์™€ ๊ฐ™์€ constructor ์•„๋ž˜ ๋ถ€๋ถ„์€ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 
๋‹คํ˜•์„ฑ! ์›๋ณธ์€ ๊ฐ™์ง€๋งŒ ์ž‘๋™์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋Š”๊ฒƒ!  

 Overloading ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‹ฌ๋ผ์„œ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š”๊ฒƒ( ์ด๊ฑฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์—†์Šต๋‹ˆ๋‹ค.)  Overriding ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ฌ๋ผ์„œ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒƒ!