[๐Ÿค–] JavaScript์˜ ํ•ต์‹ฌ: ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์™„๋ฒฝ ์ดํ•ด์™€ ํ™œ์šฉ ์ „๋žต

JavaScript์˜ ์‹ฌ์žฅ๋ถ€, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์ƒ์†์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‹ค๋ฌด์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด์„ธ์š”. ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ๋„ ํ•จ๊ป˜ ๋‹ค๋ค„์š”.

25๋ถ„
๋‹จ์–ด: 2,006๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

JavaScript ๊ฐ์ฒด๊ฐ€ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•œ ํšจ์œจ์ ์ธ ๊ฐ์ฒด ์„ค๊ณ„ ๋ฐ ์ƒ์† ํŒจํ„ด์„ ์ตํ˜€๋ณด์„ธ์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ๊ฒฝ๋ ฅ์˜ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ ๋ธ”๋ฃจ์˜ˆ์š”.
์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI๋ผ๋Š” ์ ์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค๋“œ๋ ค์š”.

์˜ค๋Š˜์€ JavaScript์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ด๋ฉด์„œ๋„ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ "ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ"์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณด๋ ค๊ณ  ํ•ด์š”.
ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด JavaScript์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹๊ณผ ์ƒ์† ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ํšจ์œจ์ ์ด๊ณ  ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”.

๐Ÿค” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ, ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด JavaScript์˜ ๊ฐ์ฒด ์ง€ํ–ฅ์  ํŠน์„ฑ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์œผ์‹œ๊ณค ํ•ด์š”.
ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์–ธ์–ด์— ์ต์ˆ™ํ•œ ๋ถ„๋“ค์—๊ฒŒ๋Š” JavaScript์˜ "ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜" ์ƒ์†์ด ๋‚ฏ์„ค๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.
ํ•˜์ง€๋งŒ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ JavaScript ๋งˆ์Šคํ„ฐ์˜ ํ•„์ˆ˜ ๊ด€๋ฌธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด์š”.

0๏ธโƒฃ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ์ƒ์†์˜ ๋ฏธ์Šคํ„ฐ๋ฆฌ

JavaScript์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŠน์ • ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์— ์ง์ ‘ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋”๋ผ๋„ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด ์ธ์Šคํ„ด์Šค๊ฐ€ map()์ด๋‚˜ forEach()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋•๋ถ„์ด์—์š”.
์ด๋Ÿฌํ•œ ๋™์ž‘์˜ ๋ฐฐ๊ฒฝ์—๋Š” JavaScript์˜ ๋…ํŠนํ•œ ์ƒ์† ๋ฐฉ์‹์ธ "ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ"์ด ์ˆจ์–ด์žˆ๋‹ต๋‹ˆ๋‹ค.

const arr = [1, 2, 3]; console.log(arr.hasOwnProperty('length')); // true console.log(arr.hasOwnProperty('map')); // false console.log(arr.map); // f map() { [native code] }

์œ„ ์ฝ”๋“œ์—์„œ arr ๊ฐ์ฒด๋Š” map ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, arr.map์„ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฅ˜ ์—†์ด map ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ํ•ด์š”.
hasOwnProperty๋Š” arr ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ length ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋Š” ์•Œ๋ ค์ฃผ์ง€๋งŒ, map ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ํ•˜์ฃ .
๊ทธ๋ ‡๋‹ค๋ฉด map์€ ์–ด๋””์—์„œ ์˜จ ๊ฑธ๊นŒ์š”? ๋ฐ”๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

1๏ธโƒฃ __proto__์™€ prototype์˜ ํ˜ผ๋ž€

JavaScript๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด __proto__์™€ prototype์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์šฉ์–ด๋ฅผ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.
์ด ๋‘ ๊ฐ€์ง€๋Š” ์ด๋ฆ„์ด ๋น„์Šทํ•ด์„œ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋Š” ์†์„ฑ๋“ค์ด์—์š”.
์ด๋“ค์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ดํ•ดํ•˜๋Š” ์ฒซ๊ฑธ์Œ์ด ๋œ๋‹ต๋‹ˆ๋‹ค.

โš™๏ธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ํ•ต์‹ฌ ์›๋ฆฌ ํŒŒํ—ค์น˜๊ธฐ

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ๊ฐ„๋‹จํžˆ ๋งํ•ด, ๊ฐ์ฒด๋“ค์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ๋œ ๋งํฌ๋“ค์˜ ์—ฐ์†์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.
์–ด๋–ค ๊ฐ์ฒด์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์— ์—†์œผ๋ฉด ์—ฐ๊ฒฐ๋œ ์ƒ์œ„ ๊ฐ์ฒด(ํ”„๋กœํ† ํƒ€์ž…)์—์„œ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์—๋„ ์—†์œผ๋ฉด ๋˜ ๊ทธ ์ƒ์œ„ ํ”„๋กœํ† ํƒ€์ž…์—์„œ ์ฐพ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด์ฃ .

0๏ธโƒฃ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ __proto__ ์ ‘๊ทผ์ž

๋ชจ๋“  JavaScript ๊ฐ์ฒด๋Š” [[Prototype]]์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.
์ด [[Prototype]]์€ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ˆจ๊ฒจ์ง„ ์ฐธ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ผ์š”.
์šฐ๋ฆฌ๋Š” ์ด [[Prototype]]์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ __proto__๋ผ๋Š” ํŠน๋ณ„ํ•œ ์ ‘๊ทผ์ž ์†์„ฑ์„ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฝ๊ณ 

__proto__๋Š” ํ‘œ์ค€ํ™”๋œ ์†์„ฑ์ด ์•„๋‹ˆ์—ˆ์ง€๋งŒ(ES6์—์„œ ๋น„๋กœ์†Œ ํ‘œ์ค€ํ™”๋˜์—ˆ์–ด์š”), ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์•„์š”.
์„ฑ๋Šฅ ๋ฌธ์ œ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์„œ, ๋Œ€์‹  Object.getPrototypeOf()๋‚˜ Object.setPrototypeOf() ๊ฐ™์€ ํ‘œ์ค€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

const person = { name: '๋ธ”๋ฃจ', greet() { console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ด์—์š”.`); } }; const developer = { __proto__: person, // developer์˜ ํ”„๋กœํ† ํƒ€์ž…์„ person์œผ๋กœ ์„ค์ • skill: 'JavaScript', code() { console.log(`${this.skill} ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์–ด์š”.`); } }; developer.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ๋ธ”๋ฃจ์ด์—์š”. (person์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์Œ) developer.code(); // JavaScript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์–ด์š”. console.log(developer.name); // ๋ธ”๋ฃจ (person์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์Œ)

์œ„ ์˜ˆ์‹œ์—์„œ developer ๊ฐ์ฒด๋Š” greet ๋ฉ”์„œ๋“œ๋‚˜ name ์†์„ฑ์„ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, __proto__๋ฅผ ํ†ตํ•ด person ๊ฐ์ฒด๋ฅผ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— person์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋งˆ์น˜ ์ž์‹ ์˜ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ prototype ์†์„ฑ๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜

prototype ์†์„ฑ์€ ์˜ค์ง ํ•จ์ˆ˜ ๊ฐ์ฒด์—๋งŒ ์กด์žฌํ•˜๋Š” ํŠน๋ณ„ํ•œ ์†์„ฑ์ด์—์š”.
์ด prototype ์†์„ฑ์€ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋  ๋•Œ, ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ [[Prototype]]์ด ๋  ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์š”.
์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์งˆ ์ธ์Šคํ„ด์Šค๋“ค์ด ๊ณต์œ ํ•  ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์ •์˜ํ•˜๋Š” ๊ณต๊ฐ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ผ์š”.

function User(name) { this.name = name; } // User.prototype์— greet ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ User.prototype.greet = function() { console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด์—์š”.`); }; const user1 = new User('์•จ๋ฆฌ์Šค'); const user2 = new User('๋ฐฅ'); user1.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ์•จ๋ฆฌ์Šค์ด์—์š”. user2.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ๋ฐฅ์ด์—์š”. console.log(user1.__proto__ === User.prototype); // true console.log(user2.__proto__ === User.prototype); // true console.log(user1.greet === user2.greet); // true (๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๊ณต์œ )

์ด ์˜ˆ์‹œ์—์„œ User ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด์š”.
User.prototype์— greet ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, new User()๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋“  user1, user2 ์ธ์Šคํ„ด์Šค๋“ค์ด ์ด greet ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋ผ์š”.
๊ฐ ์ธ์Šคํ„ด์Šค๋Š” greet ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ณ , [[Prototype]]์„ ํ†ตํ•ด User.prototype์— ์žˆ๋Š” greet ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ฃ .
์ด๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ๋งค์šฐ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด์—์š”. ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š” ์—†์ด, ํ•œ ๋ฒˆ๋งŒ ์ •์˜ํ•ด๋‘๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.

2๏ธโƒฃ ์ฒด์ธ ๋™์ž‘ ๋ฐฉ์‹: ์†์„ฑ ํƒ์ƒ‰ ๊ณผ์ •

JavaScript ์—”์ง„์ด ๊ฐ์ฒด์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•ด์š”.

์ •๋ณด

์†์„ฑ ํƒ์ƒ‰ ๊ณผ์ •

  1. ๊ฐ์ฒด ์ž์‹  ํ™•์ธ: ๋จผ์ € ํ•ด๋‹น ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด ์ž์‹ ์—๊ฒŒ ์ง์ ‘ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด์š”.
  2. ํ”„๋กœํ† ํƒ€์ž… ํ™•์ธ: ๊ฐ์ฒด ์ž์‹ ์—๊ฒŒ ์—†์œผ๋ฉด, ๊ฐ์ฒด์˜ [[Prototype]]์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์ด๋™ํ•ด์„œ ํ•ด๋‹น ์†์„ฑ์„ ์ฐพ์•„์š”.
  3. ์ฒด์ธ ์ƒ์œ„๋กœ ์ด๋™: ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋„ ์—†์œผ๋ฉด, ๊ทธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ [[Prototype]]์œผ๋กœ ๋˜ ์ด๋™ํ•ด์„œ ์ฐพ์•„์š”.
  4. null ๋„๋‹ฌ: ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ [[Prototype]]์ด null์ธ ๊ฐ์ฒด(๋ณดํ†ต Object.prototype์˜ [[Prototype]]์ด null์ด์—์š”)์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํƒ์ƒ‰ํ•ด์š”.
  5. undefined ๋ฐ˜ํ™˜: null์— ๋„๋‹ฌํ–ˆ๋Š”๋ฐ๋„ ์†์„ฑ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ต๋‹ˆ๋‹ค.

function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(`${this.name}์ด(๊ฐ€) ์†Œ๋ฆฌ๋ฅผ ๋‚ด์š”.`); }; function Dog(name, breed) { Animal.call(this, name); // Animal ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜์—ฌ name ์†์„ฑ ์ƒ์† this.breed = breed; } // Dog์˜ ํ”„๋กœํ† ํƒ€์ž…์„ Animal์˜ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์—ฐ๊ฒฐ Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; // constructor ์†์„ฑ ๋ณต๊ตฌ Dog.prototype.bark = function() { console.log(`${this.name}์ด(๊ฐ€) ๋ฉ๋ฉ ์ง–์–ด์š”!`); }; const myDog = new Dog('๋ฐ”๋‘‘์ด', '์ง„๋—๊ฐœ'); myDog.bark(); // ๋ฐ”๋‘‘์ด์ด(๊ฐ€) ๋ฉ๋ฉ ์ง–์–ด์š”! (Dog.prototype) myDog.speak(); // ๋ฐ”๋‘‘์ด์ด(๊ฐ€) ์†Œ๋ฆฌ๋ฅผ ๋‚ด์š”. (Animal.prototype) console.log(myDog.name); // ๋ฐ”๋‘‘์ด (myDog ์ž์‹ )

์œ„ ์˜ˆ์‹œ์—์„œ myDog.speak()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํƒ์ƒ‰์ด ์ด๋ฃจ์–ด์ ธ์š”.

  1. myDog ๊ฐ์ฒด์— speak ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์š”. (์—†์Œ)
  2. myDog์˜ [[Prototype]]์ธ Dog.prototype์œผ๋กœ ์ด๋™ํ•ด์„œ speak ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด์š”. (์—†์Œ)
  3. Dog.prototype์˜ [[Prototype]]์ธ Animal.prototype์œผ๋กœ ์ด๋™ํ•ด์„œ speak ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด์š”. (์—ฌ๊ธฐ์„œ ์ฐพ์Œ!)
  4. Animal.prototype์˜ speak ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์š”.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๋™์ž‘ ๋ฐฉ์‹์ด์—์š”.

๐Ÿ› ๏ธ ์‹ค์ „! ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ํ™œ์šฉ ํŒจํ„ด

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ์š”?

0๏ธโƒฃ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ƒ์†

๊ฐ€์žฅ ์ „ํ†ต์ ์ธ JavaScript์˜ ์ƒ์† ํŒจํ„ด์ด์—์š”.
์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , prototype ์†์„ฑ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒ์†์„ ๊ตฌํ˜„ํ•ด์š”.

function Vehicle(type) { this.type = type; } Vehicle.prototype.drive = function() { console.log(`${this.type}์ด(๊ฐ€) ์›€์ง์—ฌ์š”.`); }; function Car(brand) { Vehicle.call(this, '์ž๋™์ฐจ'); // ๋ถ€๋ชจ ์ƒ์„ฑ์ž ํ˜ธ์ถœ this.brand = brand; } // Car์˜ ํ”„๋กœํ† ํƒ€์ž…์„ Vehicle.prototype์„ ์ƒ์†๋ฐ›๋„๋ก ์„ค์ • Car.prototype = Object.create(Vehicle.prototype); Car.prototype.constructor = Car; // constructor ์†์„ฑ ์žฌ์„ค์ • Car.prototype.honk = function() { console.log(`${this.brand} ์ž๋™์ฐจ๊ฐ€ ๋นต๋นต๊ฑฐ๋ ค์š”!`); }; const myCar = new Car('ํ˜„๋Œ€'); myCar.drive(); // ์ž๋™์ฐจ์ด(๊ฐ€) ์›€์ง์—ฌ์š”. myCar.honk(); // ํ˜„๋Œ€ ์ž๋™์ฐจ๊ฐ€ ๋นต๋นต๊ฑฐ๋ ค์š”!

์—ฌ๊ธฐ์„œ Object.create(Vehicle.prototype)์€ Vehicle.prototype์„ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ Car.prototype์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ด์—์š”.
์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ Car ์ธ์Šคํ„ด์Šค๋Š” Vehicle.prototype์— ์ •์˜๋œ drive ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.
constructor ์†์„ฑ์„ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•œ๋ฐ์š”, Object.create()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด constructor๊ฐ€ ๋ถ€๋ชจ์˜ ๊ฒƒ์œผ๋กœ ์„ค์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ฌ๋ฐ”๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋‹ค์‹œ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ด์š”.

1๏ธโƒฃ Object.create()๋ฅผ ์ด์šฉํ•œ ๋ช…์‹œ์  ์ƒ์†

Object.create() ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์š”.
์ด๋Š” ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ง์ ‘์ ์ธ ๋ถ€๋ชจ๋กœ ์‚ผ์•„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ผ์š”.

const personPrototype = { greet() { console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด์—์š”.`); } }; const john = Object.create(personPrototype); // personPrototype์„ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ํ•˜๋Š” ๊ฐ์ฒด ์ƒ์„ฑ john.name = '์กด'; john.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ์กด์ด์—์š”. const jane = Object.create(personPrototype, { name: { value: '์ œ์ธ', writable: true, configurable: true, enumerable: true } }); jane.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ์ œ์ธ์ด์—์š”.

Object.create()๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์†์„ฑ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์–ด์„œ, ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์†์„ฑ์˜ ํŠน์„ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.
์ด ๋ฐฉ์‹์€ ์ƒ์† ์ฒด์ธ์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ํŠนํžˆ ๋ฏน์Šค์ธ(Mixin) ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ๋•Œ๋„ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํด๋ž˜์Šค(ES6)์™€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

ES6์—์„œ ๋„์ž…๋œ class ๋ฌธ๋ฒ•์€ JavaScript์— ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” "๋ฌธ๋ฒ•์  ์„คํƒ•(Syntactic Sugar)"์ด์—์š”.
์ฆ‰, class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ JavaScript์˜ ๊ฐ์ฒด ๋ชจ๋ธ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.

class Person { constructor(name) { this.name = name; } greet() { console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ด์—์š”.`); } } class Student extends Person { constructor(name, studentId) { super(name); // ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ this.studentId = studentId; } study() { console.log(`${this.name} ํ•™์ƒ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์–ด์š”. (ํ•™๋ฒˆ: ${this.studentId})`); } } const student = new Student('์ฒ ์ˆ˜', '20230001'); student.greet(); // ์•ˆ๋…•ํ•˜์„ธ์š”, ์ฒ ์ˆ˜์ด์—์š”. (Person ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ƒ์†) student.study(); // ์ฒ ์ˆ˜ ํ•™์ƒ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์–ด์š”. (ํ•™๋ฒˆ: 20230001) console.log(student instanceof Student); // true console.log(student instanceof Person); // true console.log(Object.getPrototypeOf(student) === Student.prototype); // true console.log(Object.getPrototypeOf(Student.prototype) === Person.prototype); // true

extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Student.prototype์˜ [[Prototype]]์ด ์ž๋™์œผ๋กœ Person.prototype์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •๋ผ์š”.
super() ํ˜ธ์ถœ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ this ์ปจํ…์ŠคํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ต๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ๋ชจ๋“  ์ƒ์†์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

3๏ธโƒฃ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ๋„ ์ค‘์š”ํ•ด์š”.
๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ ์ธ์Šคํ„ด์Šค์— ์ง์ ‘ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ํ”„๋กœํ† ํƒ€์ž…์— ์ •์˜ํ•˜๋ฉด, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ ํ•จ์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.

์œ ์šฉํ•œ ํŒ

๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ํŒ

  • ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํ† ํƒ€์ž…์—: ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์— ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋„๋ก ํ•˜์„ธ์š”.
  • ์†์„ฑ์€ ์ธ์Šคํ„ด์Šค์—: ๊ฐ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๊ณ ์œ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ: name, id)๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”.

// โŒ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹: ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ƒ์„ฑ function BadUser(name) { this.name = name; - this.greet = function() { - console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ด์—์š”.`); - }; } // โœ… ํšจ์œจ์ ์ธ ๋ฐฉ์‹: ํ”„๋กœํ† ํƒ€์ž…์— ํ•จ์ˆ˜ ๊ณต์œ  function GoodUser(name) { this.name = name; } + +GoodUser.prototype.greet = function() { + console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ${this.name}์ด์—์š”.`); +}; const badUser1 = new BadUser('์•จ๋ฆฌ์Šค'); const badUser2 = new BadUser('๋ฐฅ'); console.log(badUser1.greet === badUser2.greet); // false (์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๊ฐ์ฒด) const goodUser1 = new GoodUser('์ฐฐ๋ฆฌ'); const goodUser2 = new GoodUser('๋ฐ์ด๋น„๋“œ'); console.log(goodUser1.greet === goodUser2.greet); // true (๊ฐ™์€ ํ•จ์ˆ˜ ๊ฐ์ฒด ๊ณต์œ )

์œ„ diff ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, BadUser ๋ฐฉ์‹์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด greet ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•ด์š”.
๋ฐ˜๋ฉด GoodUser ๋ฐฉ์‹์€ greet ํ•จ์ˆ˜๊ฐ€ GoodUser.prototype์— ํ•œ ๋ฒˆ๋งŒ ์ •์˜๋˜๊ณ , ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ํšจ์œจ์ ์ด๋ž๋‹ˆ๋‹ค.

๐Ÿšจ ์ฃผ์˜ํ•  ์ ๊ณผ ํ”ํ•œ ์˜คํ•ด

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์–ด์š”.

0๏ธโƒฃ __proto__ ์ง์ ‘ ์ ‘๊ทผ ํ”ผํ•˜๊ธฐ

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด __proto__๋Š” ํ‘œ์ค€ํ™”๋œ ์ ‘๊ทผ์ž์ด์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ง์ ‘์ ์ธ ์‚ฌ์šฉ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์•„์š”.
๋Œ€์‹  Object.getPrototypeOf()์™€ Object.setPrototypeOf() ๊ฐ™์€ ํ‘œ์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.
์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ต๋‹ˆ๋‹ค.

const obj = {}; const proto = { value: 42 }; // โŒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ // obj.__proto__ = proto; // โœ… ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹: Object.setPrototypeOf() Object.setPrototypeOf(obj, proto); console.log(obj.value); // 42 console.log(Object.getPrototypeOf(obj) === proto); // true

1๏ธโƒฃ instanceof ์—ฐ์‚ฐ์ž์˜ ์ž‘๋™ ์›๋ฆฌ

instanceof ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด๊ฐ€ ํŠน์ • ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ์š”.
์ด ์—ฐ์‚ฐ์ž๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž(์ƒ์„ฑ์ž ํ•จ์ˆ˜)์˜ prototype์ด ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž(๊ฐ์ฒด)์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์–ด๋”˜๊ฐ€์— ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์š”.

์œ ์šฉํ•œ ํŒ

instanceof๋Š” ๊ฐ์ฒด์˜ ์‹ค์ œ ์ƒ์„ฑ์ž๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ํŠน์ • prototype ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์—์š”.
๋”ฐ๋ผ์„œ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด instanceof ๊ฒฐ๊ณผ๋„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด์š”.

function MyObject() {} const instance = new MyObject(); console.log(instance instanceof MyObject); // true console.log(instance instanceof Object); // true (MyObject.prototype์˜ ํ”„๋กœํ† ํƒ€์ž…์€ Object.prototype) const anotherObject = {}; console.log(anotherObject instanceof MyObject); // false console.log(anotherObject instanceof Object); // true

๐Ÿ“ ์ •๋ฆฌํ•˜๋ฉฐ

์˜ค๋Š˜์€ JavaScript์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ๋Œ€ํ•ด ์‹ฌ์ธต์ ์œผ๋กœ ์•Œ์•„๋ณด์•˜์–ด์š”.
[[Prototype]], __proto__, prototype์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ , ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ๋‹ต๋‹ˆ๋‹ค.

0๏ธโƒฃ ํ•ต์‹ฌ ์š”์•ฝ

  • ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ: ๊ฐ์ฒด๊ฐ€ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์„ ๋•Œ, ์ž์‹ ์—๊ฒŒ ์—†์œผ๋ฉด ๋ถ€๋ชจ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด์—์š”.
  • [[Prototype]]: ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์œผ๋กœ, ๋ถ€๋ชจ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์š”.
  • __proto__: [[Prototype]]์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ์ ‘๊ทผ์ž ์†์„ฑ์ด์ง€๋งŒ, ์ง์ ‘์ ์ธ ์‚ฌ์šฉ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์•„์š”.
  • prototype: ์˜ค์ง ํ•จ์ˆ˜ ๊ฐ์ฒด์—๋งŒ ์กด์žฌํ•˜๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋  ๋•Œ ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค๋“ค์˜ [[Prototype]]์ด ๋  ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์š”.
  • ํด๋ž˜์Šค(ES6): ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ๋ฌธ๋ฒ•์  ์„คํƒ•์ด๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์—ฌ์ „ํžˆ ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์ƒ์†์„ ์‚ฌ์šฉํ•ด์š”.
  • ํ™œ์šฉ: ์ƒ์„ฑ์ž ํ•จ์ˆ˜, Object.create(), ES6 ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ธ ๊ฐ์ฒด ์ƒ์† ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๊ธฐ

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ JavaScript์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งˆ์Šคํ„ฐํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋‹จ๊ณ„์˜ˆ์š”.
์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฒฌ๊ณ ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€์‹œ๊ธธ ๋ฐ”๋ผ์š”.
๋” ๋‚˜์•„๊ฐ€, Object.defineProperty๋ฅผ ์ด์šฉํ•œ ์†์„ฑ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ œ์–ด๋‚˜, Reflect API ๋“ฑ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ ๊ฐœ๋…๋“ค์„ ํƒ๊ตฌํ•ด ๋ณด์‹œ๋Š” ๊ฒƒ๋„ ์ถ”์ฒœํ•ด ๋“œ๋ ค์š”.

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.
๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋˜ ์œ ์ตํ•œ ๋‚ด์šฉ์œผ๋กœ ์ฐพ์•„๋ต๊ฒŒ์š”!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ