๐Ÿ—๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Prototype

21288 ๋‹จ์–ด JavaScriptPrototypeJavaScript

๐Ÿค” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ช…๋ นํ˜•(imperative), ํ•จ์ˆ˜ํ˜•(functional), ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜(prototype-based) ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP, Object Oriented Programming)์„ ์ง€์›ํ•˜๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ณด๋‹ค ํšจ์œจ์ ์ด๋ฉฐ ๋” ๊ฐ•๋ ฅํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋Šฅ๋ ฅ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ น์–ด ๋˜๋Š” ํ•จ์ˆ˜์˜ ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์ „ํ†ต์ ์ธ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(imperative programming)์˜ ์ ˆ์ฐจ์ง€ํ–ฅ์  ๊ด€์ ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์  ๋‹จ์œ„, ์ฆ‰ ๊ฐ์ฒด(Object)์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ํ‘œํ˜„ํ•˜๋ ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋งํ•œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹ค์„ธ๊ณ„์˜ ์‹ค์ฒด๋ฅผ ์ธ์‹ํ•˜๋Š” ์ฒ ํ•™์  ์‚ฌ๊ณ ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ ‘๋ชฉํ•˜๋ ค๋Š” ์‹œ๋„์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ์‹ค์ฒด๋Š” ํŠน์ง•์ด๋‚˜ ์„ฑ์งˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ(attribute/property)์„ ๊ฐ€์ง„๋‹ค.

์ด ์ค‘์—์„œ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ์†์„ฑ๋งŒ ๊ฐ„์ถ”๋ ค ๋‚ด๋Š” ๊ฒƒ์„ ์ถ”์ƒํ™”(abstraction)๋ผ ํ•œ๋‹ค. ์‚ฌ๋žŒ์˜ ์—ฌ๋Ÿฌ ํŠน์„ฑ์ค‘ โ€œ์ด๋ฆ„โ€๊ณผ โ€œ๋‚˜์ด"๋งŒ์„ ์†์„ฑ์œผ๋กœ ๊ฐ–๋Š” person์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

const crew = {
	name: "Harry"
	age: 23
};

console.log(console.log(crew)); // {name: "Harry", age: 23} 

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

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

์˜ˆ์‹œ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์‚ดํŽด๋ณด์ž

function Circle(radius) {
	this.radius = radius;
	this.getArea = function () {
		return Math.PI * this.radius ** 2;
	}
}

const circle1 = new Circle(1);
const circle2 = new Circle(2);

console.log(circle1.getArea === circle2.getArea) // false

Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋Š” radius ํ”„๋กœํผํ‹ฐ์™€ getArea ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ getArea ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ๋‚ด์šฉ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์ง์ด๋‹ค.

ํ•˜์ง€๋งŒ ์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ธ์Šคํ„ด์Šค ๋‹น ํ•˜๋‚˜์”ฉ ๋ชจ๋‘ getArea ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ํ†ตํ•ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์—์„œ ์‚ดํŽด๋ณด์ž.


๐Ÿงฉ ์ƒ์†(inheritance)์ด๋ž€ ์šฉ์–ด์— ๋Œ€ํ•ด์„œ

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

์ด์— ๋Œ€ํ•ด ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์ƒ์†์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ์ฑ…์— ๋Œ€ํ•ด ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๊ณค ํ•œ๋‹ค.
์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š”

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

๋ผ๊ณ  ํ•˜๋ฉฐ, YOU DON'T KNOW JS์—์„œ๋Š”

๋‘ ๊ฐ์ฒด์— ๋งํฌ๋ฅผ ๊ฑธ์–ด๋‘๊ณ  ํ•œ์ชฝ์ด ๋‹ค๋ฅธ ์ชฝ์˜ ํ”„๋กœํผํ‹ฐ/ํ•จ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ์œ„์ž„(Delegaton)ํ•œ๋‹ค. ์œ„์ž„์ด์•ผ๋ง๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด-์—ฐ๊ฒฐ ์ฒด๊ณ„๋ฅผ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ธ ์šฉ์–ด๋‹ค.

๋ผ๊ณ  ํ•˜๋ฉฐ, ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive์—์„œ๋Š” ๊ทธ๋ƒฅ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์ƒ์†์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค. ๋‚˜๋Š” ์ผ๋‹จ ์ƒ์†์ด๋ž€ ์šฉ์–ด๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

์–ด์ฐŒ ๋๋“  ์œ„์— ์„ค๋ช…ํ•œ๋Œ€๋กœ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋™์ž‘์ด ํด๋ž˜์Šค์˜ ์ƒ์†๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ์ดํ•ดํ•˜๊ณ  ํ”„๋กœํ† ํƒ€์ž…์˜ ๋™์ž‘์ด ์–ด๋– ํ•œ์ง€ ์ดํ•ดํ•˜๋Š”๋ฐ์— ์ดˆ์ ์„ ๋งž์ถฐ๋ณด๋„๋ก ํ•˜์ž.


๐Ÿ”— ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ ์ดํ•ด

function Circle(radius) {
	this.radius = radius;
}

Circle.prototype.getArea = function () {
	return Math.PI * this.radius ** 2;
}

const circle1 = new Circle(1);
const circle2 = new Circle(2);

console.log(circle1.getArea === circle2.getArea) // true

Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…, ์ฆ‰ ์ƒ์œ„(๋ถ€๋ชจ) ๊ฐ์ฒด ์—ญํ• ์„ ํ•˜๋Š” Circle.prototype์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” getArea ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ”„๋กœํ† ํƒ€์ž…์— ๊ตฌํ˜„ํ•ด ๋‘๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

์œ„์—์„œ ์‚ดํŽด๋ดค๋“ฏ์ด ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃจ๋Š” ๊ฐ์ฒด ๊ฐ„ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๋Š” [[Prototype]]์ด๋ผ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง„๋‹ค. [[Prototype]]์— ์ €์žฅ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์€ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์— ๋”ฐ๋ผ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ฒฐ์ •๋˜๊ณ  [[Prototype]]์— ์ €์žฅ๋œ๋‹ค.

  1. ๋ชจ๋“  ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค
    ([[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ ๊ฐ’์ด null์ธ ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด ์—†๋‹ค)
  2. ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

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


__proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ

__proto__๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ด๋ฏ€๋กœ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์˜ ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค. [[get]], [[Set]] ๋‚ด๋ถ€์˜ getter/setter ์ ‘๊ทผ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ์ฝ์–ด์˜ค๊ฑฐ๋‚˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜น์‹œ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋ฅผ ์ฝ๊ณ  ์™€๋ผ

__proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ Object.prototype์˜ ํ”„๋กœํผํ‹ฐ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ƒ์†์„ ํ†ตํ•ด Object.prototype.__proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

  • Object.getPrototypeOf: ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฐธ์กฐ๋ฅผ ์ทจ๋“
  • Object.setPrototypeOf: ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด

๋ชฉ์ ์— ๋”ฐ๋ผ ์œ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.


ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ prototype ํ”„๋กœํผํ‹ฐ

ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ์ด ์†Œ์œ ํ•˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” (์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด Object.prototype์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€) __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์™€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋Š” ๊ฒฐ๊ตญ ๋™์ผํ•œ ํ”„๋กœํ†  ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. (ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด ์œ„์˜ ๊ทธ๋ฆผ์„ ๊ฐ€์ ธ์™€์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด์ž.)

non-constructor ํ•จ์ˆ˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š๊ณ , ํ”„๋กœํ† ํƒ€์ž…๋„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” constructor ํ•จ์ˆ˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ ํ•˜์ง€๋งŒ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.


ํ”„๋กœํ† ํƒ€์ž…์˜ constructor ํ”„๋กœํผํ‹ฐ์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜

๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž…์€ constructor ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” prototype ํ”„๋กœํผํ‹ฐ๋กœ ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ์—ฐ๊ฒฐ์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ฆ‰ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด๋ค„์ง„๋‹ค. (์ด๊ฒƒ ๋˜ํ•œ ์œ„์˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์ดํ•ดํ•˜๋ฉด ํŽธํ•˜์ž)

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

๊ฐ„๋‹จํ•˜๊ฒŒ constructor๊ฐ€ ์–ธ์ œ๋‚˜ ์ž์‹ ์„ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ ๋งŒ ์•Œ๊ณ  ์žˆ์ž


๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๊ฒฐ๋ก ๋ถ€ํ„ฐ ์ง€๋ฅด๊ณ  ๊ฐ€์ž๋ฉด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋„ ์ƒ์†์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์ƒ์ ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ–๊ณ , ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋˜๋ฉฐ prototype, constructor ํ”„๋กœํผํ‹ฐ์— ์˜ํ•ด ์„œ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋‹จ๋…์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์—†๊ณ  ์–ธ์ œ๋‚˜ ์Œ(pair)์œผ๋กœ ์กด์žฌํ•œ๋‹ค

ํฐ ํ‹€์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์™€ ๋ณธ์งˆ์ ์ธ ๋ฉด์—์„œ ํฐ ์ฐจ์ด๋Š” ์—†๋‹ค. (์ƒ์„ฑ ๊ณผ์ •๊ณผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์—์„œ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋™์ผํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค)

๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์ƒ์„ฑ์ž ํ•จ์ˆ˜ํ”„๋กœํ† ํƒ€์ž…
๊ฐ์ฒด ๋ฆฌํ„ฐ๋ŸดObjectObject.prototype
ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋ŸดFunctionFunction.prototype
๋ฐฐ์—ด ๋ฆฌํ„ฐ๋ŸดArrayArray.prototype
์ •๊ทœ ํ‘œํ˜„์‹ ๋ฆฌํ„ฐ๋ŸดRegExpRegExp.prototype

ํ”„๋กœํ† ํƒ€์ž…์˜ ์ƒ์„ฑ ์‹œ์ 

ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ๋”๋ถˆ์–ด ์ƒ์„ฑ๋œ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์™€ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ๊ฐ ํ”„๋กœํ† ํƒ€์ž… ์ƒ์„ฑ์‹œ์ ์€ ์–ธ์ œ์ผ์ง€ ์‚ดํŽด๋ณด์ž.

  • ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜: ์ „์—ญ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์  (์ „์—ญ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋Œ)
  • ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜: ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ 

๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ด์ „์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…์€ ์ด๋ฏธ ๊ฐ์ฒดํ™”๋˜์–ด ์กด์žฌํ•œ๋‹ค. ์ดํ›„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ํ• ๋‹น๋œ๋‹ค.


Object.create์— ์˜ํ•œ ์ง์ ‘ ์ƒ์†

Object.create ๋ฉ”์„œ๋“œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ๊ฐ์ฒด์—๋Š” ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ‚ค์™€ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐ์ฒด๋กœ ์ด๋ค„์ง„ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

function Person(name) {
	this.name = name;
}

harry = Object.create(Person.prototype); // ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ƒ๋žต๊ฐ€๋Šฅํ•˜๋‹ค
harry.name = 'Harry';

์ด์ฒ˜๋Ÿผ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์†ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Object.create๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • new ์—ฐ์‚ฐ์ž ์—†์ด๋„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ”„๋กœํ† ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


โ›“๏ธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

function Person(name) {
	this.name = name;
}

const harry = new Person('Harry');
console.log(harry.hasOwnProperty('name'); // true

๋งˆ์ง€๋ง‰ ์ค„์— hasOwnProperty๋Š” Object.prototype์˜ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋Š” harry๊ฐ€ Person.prototype ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Object.prototype๋„ ์ƒ์†๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ๋œ ์ผ์ธ์ง€ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž. (ESLint๋Š” ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Object.prototype์˜ ๋นŒํŠธ์ธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.)

console.log(Object.prototype.hasOwnProperty.call(harry, 'name');
// ์œ„์™€ ๊ฐ™์ด ๊ฐ„์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

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

์œ„ ์ฝ”๋“œ์—์„œ harry ๊ฐ์ฒด์—์„œ hasOwnProperty๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๋ฉด์„œ ์œ„ ๊ณผ์ •์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€๋ฅผ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์ž.

  1. harry ๊ฐ์ฒด์—์„œ hasOwnProperty ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  2. ์—†์œผ๋ฏ€๋กœ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๋ฐ”์ธ๋”ฉ ๋˜์–ด์žˆ๋Š” Person.prototype์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  3. Person.prototype์—์„œ hasOwnProperty ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  4. ์—†์œผ๋ฏ€๋กœ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๋ฐ”์ธ๋”ฉ ๋˜์–ด์žˆ๋Š” Object.prototype์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
  5. Object.prototype์—์„œ hasOwnProperty ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  6. ์žˆ์œผ๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ Object.prototype.hasOwnProperty ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ตœ์ƒ์œ„์— ์œ„์น˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์–ธ์ œ๋‚˜ Object.prototype์ด๋‹ค. Object.prototype์„ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ข…์ (end of protoptype chain)์ด๋ผํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Object.prototype์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Prototype]]์˜ ๊ฐ’์€ null์ด๋‹ค.

๊ฒฐ๊ตญ, ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ž€ ์ƒ์†๊ณผ ํ”„๋กœํผํ‹ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ํ”„๋กœํผํ‹ฐ ์„€๋„์ž‰

  • ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ: ํ”„๋กœํ† ํƒ€์ž…์ด ์†Œ์œ ํ•œ ํ”„๋กœํผํ‹ฐ(๋ฉ”์„œ๋“œ ํฌํ•จ)
  • ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ: ์ธ์Šคํ„ด์Šค๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœํผํ‹ฐ
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

์ด ๋•Œ, ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ํ•˜๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ๋”ฐ๋ผ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ƒ์† ๊ด€๊ณ„์— ์˜ํ•ด ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ์„ ํ”„๋กœํผํ‹ฐ ์„€๋„์ž‰(property shadowing)์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋‘˜์„ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

function Person(name) {
	this.name = name;
} 

Person.prototype.greeting = function () {
	console.log(`Hi! I'm ${this.name}`);
}

const harry = new Person('Harry');

// ์˜ค๋ฒ„๋ผ์ด๋”ฉ
harry.prototype.greeting = function () {
	console.log(`Hello! I'm ${this.name}`);
}

// Person.prototype์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ”„๋กœํผํ‹ฐ ์„€๋„์ž‰๋˜์—ˆ๋‹ค.
harry.greeting(); // Hello! I'm Harry

๐Ÿง ์ •๋ฆฌ

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

๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

  • ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive
      1. ํ”„๋กœํ† ํƒ€์ž… (260p~311p)
  • ์ฝ”์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
      1. ํ”„๋กœํ† ํƒ€์ž… (147p~173p)
  • YOU DONโ€™T KNOW JS
      1. ํ”„๋กœํ† ํƒ€์ž… (113p~140p)
  • ์šฐํ…Œ์ฝ” ๋ ˆ๋ฒจ1 ํ•™์Šต์ž๋ฃŒ
    • ๋กœ๋˜ - ๋ชจ๋ธ๋ง๊ณผ ์„ค๊ณ„ ๐Ÿ—๏ธ Prototype ๋ฌธ์„œ

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ