๐๏ธ ์๋ฐ์คํฌ๋ฆฝํธ์ Prototype
๐ค ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ช ๋ นํ(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]]์ ์ ์ฅ๋๋ค.
- ๋ชจ๋ ๊ฐ์ฒด๋ ํ๋์ ํ๋กํ ํ์
์ ๊ฐ๋๋ค
([[Prototype]] ๋ด๋ถ ์ฌ๋กฏ ๊ฐ์ด null์ธ ๊ฐ์ฒด๋ ํ๋กํ ํ์ ์ด ์๋ค) - ๋ชจ๋ ํ๋กํ ํ์ ์ ์์ฑ์ ํจ์์ ์ฐ๊ฒฐ๋์ด ์๋ค.
๊ฐ์ฒด์ ํ๋กํ ํ์
๊ณผ ์์ฑ์ ํจ์๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋ก ์ฐ๊ฒฐ๋์ด์๋ค. [[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)์ผ๋ก ์กด์ฌํ๋ค
ํฐ ํ์์ ์๊ฐํด๋ณด๋ฉด ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑํ ๊ฐ์ฒด๋ ์์ฑ์ ํจ์๋ก ์์ฑํ ๊ฐ์ฒด์ ๋ณธ์ง์ ์ธ ๋ฉด์์ ํฐ ์ฐจ์ด๋ ์๋ค. (์์ฑ ๊ณผ์ ๊ณผ ์ฌ๋ฌ ๊ฐ์ง์์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ ์๋ ์์ง๋ง ๊ฒฐ๊ตญ ๋์ผํ ํน์ฑ์ ๊ฐ์ง๋ค)
๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ์ํด ์์ฑ๋ ๊ฐ์ฒด์ ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์ ์๋์ ๊ฐ๋ค.
๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ | ์์ฑ์ ํจ์ | ํ๋กํ ํ์ |
---|---|---|
๊ฐ์ฒด ๋ฆฌํฐ๋ด | Object | Object.prototype |
ํจ์ ๋ฆฌํฐ๋ด | Function | Function.prototype |
๋ฐฐ์ด ๋ฆฌํฐ๋ด | Array | Array.prototype |
์ ๊ท ํํ์ ๋ฆฌํฐ๋ด | RegExp | RegExp.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๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด์ ์ ๊ณผ์ ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง๋ฅผ ํ ๋ฒ ์ดํด๋ณด์.
- harry ๊ฐ์ฒด์์ hasOwnProperty ๋ฉ์๋๋ฅผ ๊ฒ์ํ๋ค.
- ์์ผ๋ฏ๋ก [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๋ฐ์ธ๋ฉ ๋์ด์๋ Person.prototype์ผ๋ก ์ด๋ํ๋ค.
- Person.prototype์์ hasOwnProperty ๋ฉ์๋๋ฅผ ๊ฒ์ํ๋ค.
- ์์ผ๋ฏ๋ก [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๋ฐ์ธ๋ฉ ๋์ด์๋ Object.prototype์ผ๋ก ์ด๋ํ๋ค.
- Object.prototype์์ hasOwnProperty ๋ฉ์๋๋ฅผ ๊ฒ์ํ๋ค.
- ์์ผ๋ฏ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ 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
- ํ๋กํ ํ์ (260p~311p)
- ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ
- ํ๋กํ ํ์ (147p~173p)
- YOU DONโT KNOW JS
- ํ๋กํ ํ์ (113p~140p)
- ์ฐํ
์ฝ ๋ ๋ฒจ1 ํ์ต์๋ฃ
- ๋ก๋ - ๋ชจ๋ธ๋ง๊ณผ ์ค๊ณ ๐๏ธ Prototype ๋ฌธ์
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐๏ธ ์๋ฐ์คํฌ๋ฆฝํธ์ Prototype), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@thumb_hyeok/์๋ฐ์คํฌ๋ฆฝํธ์-Prototype์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค