๐ŸŽ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (13) prototype vs __proto__

๐Ÿ’ƒ๐Ÿป์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด

function Person() {} //statement ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.

const Person = new Function() // ์œ„์™€ ๋™์ผํ•˜๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋“ค์€ property ๋“ค์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

structure

function Person(name, first, second) {
  this.name = name
  this.first = first
  this.second = second
}

ํ•จ์ˆ˜ Person ์˜ ์„ ์–ธ์„ ํ†ตํ•ด ๋ถ„ํ™ ๋ฐ•์Šค์ธ Person ๊ฐ์ฒด ์•ˆ์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ โ€œprototypeโ€ ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ๊ธฐ๊ณ ,

๊ทธ ํ”„๋กœํผํ‹ฐ๋Š” Person ์˜ prototype ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. (๋…น์ƒ‰ ๋ฐ•์Šค ์ฐธ์กฐ)

๋…น์ƒ‰ ๋ฐ•์Šค๋ฅผ ๋ณด๋ฉด ์ฆ‰, Person.prototype ๊ฐ์ฒด ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋…น์ƒ‰ ๋ฐ•์Šค์ธ Person.prototype ๊ฐ์ฒด๋„ ์ž์‹ ์ด Person ์˜ ์†Œ์†์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด โ€œconstructorโ€ ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ 

๊ทธ ํ”„๋กœํผํ‹ฐ๋Š” Person ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค (์ƒํ˜ธ ์ฐธ์กฐ๋ฅผ ํ•˜๋„ค)

์ผ๋‹จ ์—ฌ๊ธฐ ๊นŒ์ง€ ๋Š๊ณ ..

์‰ฝ๊ฒŒ ์‰ฝ๊ฒŒ ์‰ฝ๊ฒŒ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ค„์—ฌ๋ณด๋ฉด

์‚ฌ๋žŒ์„ ์ฐ์–ด๋‚ด๋Š”? ๊ณต์žฅ์ธ Person ๊ณต์žฅ์€ ์„ค๋ฆฝ๋˜์ž๋งˆ์ž name, first, second ๋“ฑ์˜ ์†์„ฑ์ด ์ƒ๊น€๊ณผ ๋™์‹œ์— ๋‚ด๋ถ€์ ์œผ๋กœ ๋˜ prototype ์ด๋ผ๋Š” ์†์„ฑ๋„ ํ•จ๊ป˜ ์ƒ๊ธฐ๊ณ  ๊ทธ ์†์„ฑ์€ Person.prototype ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋ฉฐ ๊ทธ ํ•ด๋‹น ๊ฐ์ฒด ์—ญ์‹œ constructor ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ฌ๊ณผ ๋™์‹œ์— Person ๊ณต์žฅ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๋ง์ด๋‹ค.

์•„ ๋˜‘๊ฐ™์ด ์–ด๋ ต๋„ค..

Person.prototype.sum = function () {}

Person.prototype.sum = function() {}

ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ฆผ ๊ทธ๋Œ€๋กœ Person.prototype ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ  ์ด์ œ javascript ๋Š” sum() ์ด ์—†๋„ค. ๊ทธ๋Ÿผ ์ƒ์„ฑํ•˜์ž. ํ•˜๋ฉด์„œ constructor ์— sum() ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

const kim = new Person(โ€˜kimโ€™, 10, 20)

const kim = new Person('kim', 10, 20)

๋งจ ์œ„์— Person ์ด๋ผ๊ณ  ํ•˜๋Š” constructor function ์ด ์‹คํ–‰๋˜๋ฉด์„œ (๊ณต์žฅ์ด ๊ฐ€๋™๋˜๋ฉด์„œ) this ์˜ ๊ฐ’์ด ์„ธํŒ…๋œ ๊ฒฐ๊ณผ๋ฅผ ๋…ธ๋ž€ ๋ฐ•์Šค์— ๋‹ด์•˜๋‹ค.

์ด๋ ‡๋“ฏ name, first, second ๋ผ๋Š” ์†์„ฑ์ด ์ƒ์„ฑ์ด ๋จ๊ณผ ๋™์‹œ์—,

__proto__ ๋ผ๋Š” ์ฃผ์ธ๊ณต์ด ์ž๋™ ์ƒ์„ฑ์ด ๋œ๋‹ค.

์ด์ œ kim ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ Person ์˜ prototype ์ด __proto__ ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ Person ์˜ prototype ์„ ํ†ตํ•ด์„œ๋„ Personโ€™s prototype ์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ ,

kim ์˜ __proto__ ๋ฅผ ํ†ตํ•ด์„œ๋„ Personโ€™s prototype ์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

console.log(kim.name)

console.log(kim.name)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—์„œ๋Š” kim ์ด๋ผ๋Š” ๊ฐ์ฒด์— name ์ด๋ผ๋Š” property ๊ฐ€ ์žˆ๋Š”์ง€ ์šฐ์„ ์ ์œผ๋กœ ์ฐพ๋Š”๋‹ค. ๋…ธ๋ž€ ๋ฐ•์Šค์— ์žˆ๋‹ค.

์—†๋‹ค๋ฉด __proto__ ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์— name ์ด ์žˆ๋Š”์ง€ ์ฐพ๊ฒŒ ๋œ๋‹ค.

kim.sum()

sum()

sum() ์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—์„œ๋Š” __proto__ ๋ฅผ ํ†ตํ•ด ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” Personโ€™s prototype ์— sum ์ด ์žˆ๋Š”์ง€๋ฅผ ์ฐพ๋Š”๋‹ค.

์žˆ๋‹ค. ์‚ฌ์šฉํ•œ๋‹ค.

๋งŒ์•ฝ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–˜๋„ __proto__ ๊ฐ€ ์žˆ์„ ํ…Œ๋‹ˆ ๋˜ ์ฐพ์•„๊ฐˆํ…Œ์ง€๋งŒ ์ผ๋‹จ ๋…ผ์™ธ๋กœ ๋‘”๋‹ค.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง๊ฒฐ๋ก 

์ƒ์„ฑ์ž๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์—์„œ ํ•ด๋‹น ๊ฐ์ฒด์— ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ __proto__ ๋ฅผ ํ†ตํ•ด์„œ ๋ถ€๋ชจ prototype ๊ฐ์ฒด์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐพ์•„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ถ€๋ชจ์—์„œ prototype ํ”„๋กœํผํ‹ฐ๋Š” ๋”ฐ๋กœ prototype ๊ฐ์ฒด๋ฅผ ๋‘์–ด ๋ฐ”๋กœ ์ž์‹ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ• ๋•Œ ๋ถ€๋ฅผ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ณ  ์ž์‹ __proto__ ๊ฒฝ์šฐ๋Š” ๋ถ€๋ชจ prototype์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ถ€๋ชจ ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ผ๊ณ  ์จ๋†“์€ ๋Œ“๊ธ€์„ ๋ถ™์—ฌ ์™”๋Š”๋ฐ ์ด๊ฑด ์ข€๋” ์ƒ๊ฐํ•ด ๋ด์•ผ ํ•  ๊ฑฐ ๊ฐ™๋‹ค.


Written by@[DotoriMook]
ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋„ํ† ๋ฆฌ๋ฌต์˜ ๊ธฐ์ˆ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

GitHubMediumTwitterFacebook