Programming/JavaScript

[JS] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์†๊ณผ prototype

Space_Jin 2022. 8. 4. 20:00
728x90
๋ฐ˜์‘ํ˜•

์ด๋ฒˆ์— ํšŒ์‚ฌ์—์„œ ๋ฐฐ์น˜๋ฐ›์€ ํŒ€์€ ๋ชจ๋ฐ”์ผ ์„œ๋น„์Šค ํŒ€์ด์—ˆ๋‹ค.

 

๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ์•„๋ž˜์—  ์›น ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋‹น๋ถ„๊ฐ„์€ ํ”„๋ก ํŠธ ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

JS๋Š” DOM ์กฐ์ž‘ ์™ธ์—๋Š” ๋‹ค๋ค„๋ณผ ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ๊ธฐ์— ์ด๋ฒˆ์— prototype์— ๋Œ€ํ•œ ๊ฐœ๋…๋„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

JS๋Š” prototype ๊ธฐ๋ฐ˜ ์–ธ์–ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค๋Š”๋ฐ ๊ธฐ๋ณธ๋„ ๋ชฐ๋ž๋˜ ๊ฑฐ์‹œ์˜€๋‹ค... ํ•œ ๋™์•ˆ JS๋ฅผ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

prototype์€ JS์—์„œ ๊ฐ์ฒด์˜ ์ƒ์†์„ ๋‹ค๋ฃจ๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ, ์ค‘์š”ํ•œ ๊ฐœ๋…์ด์—ˆ๋‹ค. ์‚ฌ์‹ค JS๋„ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ผ๊ธฐ๋„ ํ–ˆ๋‹ค.

๋˜ ์—ญ์‹œ JS๋‹ต๊ฒŒ ๊ต‰์žฅํžˆ ์‹ฌํ”Œํ–ˆ๋‹ค.

๐Ÿง ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ์ƒ์„ฑ

function MyObject(์ธ์ž) {
	this.property1 = ...
	this.property2 = ์ธ์ž
}
class MyObject {
	constructor(์ธ์ž) {
    		this.property1 = ...
    		this.property2 = ์ธ์ž
      }
}

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์œ„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ธ๋ฐ ์•„๋ž˜ ๋ฐฉ์‹์˜ class๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ SE6 ์ดํ›„์— ๋‚˜์˜จ ๋ฌธ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ์ธ์ง€ ๋Œ€์ฒด๋กœ function์„ ์‚ฌ์šฉํ•˜๋Š” ์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋“ค์ด ๋Œ€๋ถ€๋ถ„์ธ ๋“ฏํ•˜๋‹ค.

๐Ÿค” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ prototype์„ ์ด์šฉํ•œ ์ƒ์†

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ prototype์ด๋ผ๋Š” property๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ด property์•ˆ์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ทธ๊ฒƒ์ด '๋ถ€๋ชจ' ๊ฐ์ฒด๊ฐ€ ๋˜๋ฉด์„œ ์ƒ์†์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

function Papa(){
	this.age = 50
}

function Son() {
	this.name = 'son'
}

var sam = new Son()
sam.prototype = new Papa()	// Son์˜ ๋‹คํ˜•์„ฑ ๊ฐ์ฒด์ธ sam์€ Papa๊ฐ์ฒด๋ฅผ ๋ถ€๋ชจ ๊ฐ์ฒด๋กœ ์ƒ์† ๋ฐ›๋Š”๋‹ค.

console.log(sam.name)	// >>> son
console.log(sam.age)	// >>> 50

์‹ค์ œ๋กœ sam์ด๋ผ๋Š” ๊ฐ์ฒด๋Š” Son ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— age๋ผ๋Š” ์†์„ฑ์€ ์—†์ง€๋งŒ, prototype์ด๋ผ๋Š” ์†์„ฑ ์•ˆ์— Papa๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์†๋ฐ›์•˜๊ธฐ์— Papa๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” age๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

sam.protytpe.tall = 180
console.log(sam.tall) // >>> 180

์œ„ ์ฒ˜๋Ÿผ ๊ผญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ prototype ์•ˆ์— property๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

ํ™•์‹คํžˆ ๋ฌธ๋ฒ•์ด ์ž์œ ๋กญ๋‹ค.

๐Ÿฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ prototype chain

์œ„ ์ฝ”๋“œ์—์„œ ๋ณด๋“ฏ์ด sam.age์˜ ๋™์ž‘์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ด๋ค„์ง„๋‹ค.

sam ๊ฐ์ฒด์—์„œ age ์†์„ฑ์„ ์ฐพ์Œ -> ์—†์Œ -> prototype์—์„œ ์ฐพ์Œ -> prototype์•ˆ์— Papa ๊ฐ์ฒด์—์„œ ์ฐพ์Œ -> ์ถœ๋ ฅ

๋งŒ์•ฝ, prototype ๊ฐ์ฒด์˜ Papa ๊ฐ์ฒด์—๋„ ์—†์—ˆ๋‹ค๋ฉด, Papa ๊ฐ์ฒด ์•ˆ์˜ prototype์—์„œ ์ฐพ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. -> ์–ธ์ œ๊นŒ์ง€? ์ตœ์ƒ์œ„ ๊ฐ์ฒด๊นŒ์ง€

 

์ด๋ ‡๊ฒŒ prototype์„ ์—ฐ์‡„์ ์œผ๋กœ ์ฐพ๋Š”๋‹ค ํ•˜์—ฌ ์ด๋ฅผ prototype chain์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค๊ณ  ํ•œ๋‹ค.

 

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

 

์ด์ƒ ๋„์•

728x90
๋ฐ˜์‘ํ˜•