ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜•, ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ๋ฉ€ํ‹ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. C++๋‚˜ ์ž๋ฐ”์™€ ๊ฐ™์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ณด๋‹ค ํšจ์œจ์ ์ด๋ฉฐ ๋” ๊ฐ•๋ ฅํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋Šฅ๋ ฅ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

 

// ์ด๋ฆ„๊ณผ ์ฃผ์†Œ ์†์„ฑ์„ ๊ฐ–๋Š” ๊ฐ์ฒด
const person = {
    name: 'Lee',
    address: 'Seoul'
};

const circle = {
    radius: 5,

    getDiameter() {
        return 2 * radius;
    }
};

 

์‹ค์„ธ๊ณ„์˜ ์‹ค์ฒด(์‚ฌ๋ฌผ์ด๋‚˜ ๊ฐœ๋…)๋Š” ํŠน์ง•์ด๋‚˜ ์„ฑ์งˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์„ ํ†ตํ•ด ์‹ค์ฒด๋ฅผ ์ธ์‹ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„์˜ ์˜ˆ์ œ person์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ ‘๋ชฉ์‹œ์ผœ *์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ, ์œ„์˜ ์˜ˆ์ œ circle์ฒ˜๋Ÿผ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ์™€ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 

 

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

 

*์ถ”์ƒํ™” : ๋‹ค์–‘ํ•œ ์†์„ฑ ์ค‘์—์„œ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ์†์„ฑ๋งŒ ๊ฐ„์ถ”๋ ค ๋‚ด์–ด ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ


์ƒ์†๊ณผ ํ”„๋กœํ† ํƒ€์ž…

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

 

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Cricle(radius) {
    this.radius = radius;
}


// Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ getArea ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœํ† ํƒ€์ž…์— ์ถ”๊ฐ€
// ํ”„๋กœํ† ํƒ€์ž…์€ Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์Œ
Circle prototype.getArea = function () {
    return Math.PI * this.radius ** 2;
};

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const circlel1 = new Circle(1);
const circlel2 = new Circle(2);

// Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์—์„œ getArea ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์Œ
// ์ฆ‰, Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜์˜ getArea ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต์œ ํ•จ
console.log(circle1.getArea == circle2.getArea); // true
console.log(circle1.getArea()); // 3.14...
console.log(circle1.getArea()); // 12.56...

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

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


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

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

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

 

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

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

์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด person ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • __proto__๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฒด์ ์œผ๋กœ๋Š” ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์ž ํ•จ์ˆ˜, ์ฆ‰ [[Get]], [[Set]] ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • __proto__ ๋Š” ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ƒ์†์„ ํ†ตํ•ด Object.prototype.__proto__์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผํ•˜๋Š” ์ด์œ ๋Š” ์ƒํ˜ธ ์ฐธ์กฐ์— ์˜ํ•ด ํ”„๋กœํฌํƒ€์ž… ์ฒด์ธ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ๋‹จ๋ฐฉํ–ฅ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ˆœํ™˜ ์ฐธ์กฐ์— ์˜ํ•ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผํ•˜๊ณ  ๊ต์ฒดํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์ƒ๊ฒผ์„๋•Œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
const parent = {};
const child = {};

// child์˜ ํ”„๋กœํ† ํƒ€์ž…์„ parent๋กœ ์„ค์ •
child.__proto__ parent;
// parent๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ child์˜ ์„ค์ •
parent.__protp__ child; // TypeError
  • __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ”๋“œ ๋‚ด์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฐธ์กฐ๋ฅผ ์ทจ๋“ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—” Obejct.getPrototypeOf ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์„ ํ•˜๊ณ , ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—” Obejct.setPrototypeOf ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

 

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

ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ์ด ์†Œ์œ ํ•˜๋Š” proototype ํ”„๋กœํผํ‹ฐ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ๋•Œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

 

// ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ 
(function () {}).hasOwnProperty('prototype'); // true

// ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ X
({}).hasOwnProperty('prototype'); // false

 

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

 

๊ตฌ๋ถ„ ์†Œ์œ  ๊ฐ’ ์‚ฌ์šฉ ์ฃผ์ฒด ์‚ฌ์šฉ ๋ชฉ์ 
__proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ ๋ชจ๋“  ๊ฐ์ฒด ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฐธ์กฐ ๋ชจ๋“  ๊ฐ์ฒด ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ ‘๊ทผ ๋˜๋Š” ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
proototype ํ”„๋กœํผํ‹ฐ constructor ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฐธ์กฐ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์ƒ์„ฑํ•  ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

 

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

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

 

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name){
    this.name = name;
}

const me = new Person('Lee');

// me ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” Person
console.log(me.constructor === Person); // true

์œ„ ์˜ˆ์ œ๋Š” ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ ธ me ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ํƒ€์ž…์€ Person.prototype์˜ constructor ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.


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

์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด์™ธ์— ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ๋ฐฉ์‹๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
const obj = {};

// ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด
const add = function (a,b) { return a + b; };

// ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด
const arr = [1, 2, 3];

// ์ •๊ทœ ํ‘œํ˜„์‹ ๋ฆฌํ„ฐ๋Ÿด
const regexp = /is/ig;

 

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

 

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

 

๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ• ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…
๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด Obejct Object.prototype
ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด Function Function.prototype
๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด Array Array.prototype
์ •๊ทœ ํ‘œํ˜„์‹ ๋ฆฌํ„ฐ๋Ÿด RegExp RegExp.prototype

 

constructor ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ผ๊ณ  ๋‹จ์ •์ง€์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋งŒ ์žˆ์„๋ฟ ๊ฒฐ๊ตญ ๊ฐ์ฒด๋กœ์„œ ๋™์ผํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž…์˜ contstructor ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•ด๋„ ํฌ๊ฒŒ ๋ฌด๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


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

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

  • ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  • ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜

์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž… ์ƒ์„ฑ ์‹œ์ 

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜, ์ฆ‰ constructor๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž…๋„ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

// ํ•จ์ˆ˜ ์ •์˜(constructor)๊ฐ€ ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž…์ด ์ƒ์„ฑ
// ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ… : ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—”์ง„์— ์˜ํ•ด ๋จผ์ € ์‹คํ–‰๋จ
console.log(Person1.prototype); // {constructor: f}

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person1(name) {
    this.name = name;
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” non-constructor
const Person2 = name => {
    this.name = name;
}

console.log(Person2.prototype); // undefined

 

 

์ด์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ํ‰๊ฐ€๋˜์–ด ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž…๋„ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž…์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ Object.prototype์ž…๋‹ˆ๋‹ค.

 

๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž… ์ƒ์„ฑ ์‹œ์ 

 Object, String, Number, Function, Array, RegExp, Date, Promise ๋“ฑ๊ณผ ๊ฐ™์€ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž…์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋˜์–ด ์ƒ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž…์€ ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

 

 

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


๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹๊ณผ ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ฒฐ์ •

๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด, Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜, ์ƒ์„ฑ์ž ํ•จ์ˆ˜, Object.create๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฐฉ์‹๋งˆ๋‹ค ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์— ์ฐจ์ด๋Š” ์žˆ์œผ๋‚˜ *์ถ”์ƒ ์—ฐ์‚ฐ OrdinaryObejctCreate์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

*์ถ”์ƒ ์—ฐ์‚ฐ : ECMAScript ์‚ฌ์–‘์—์„œ ๋‚ด๋ถ€ ๋™์ž‘์˜ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ‘œํ˜„ํ•œ ๊ฒƒ

 

์ฆ‰, ํ”„๋กœํ† ํƒ€์ž…์€ ์ถ”์ƒ ์—ฐ์‚ฐ OrdinaryObejctCreate์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ณ  ์ด ์ธ์ˆ˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด : ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด ํ‰๊ฐ€ ๋˜๋ฉด ์ถ”์ƒ ์—ฐ์‚ฐ์— ์˜ํ•ด Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ Object.prototype๊ณผ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์‚ฌ์ด์— ์—ฐ๊ฒฐ์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์— ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋จ
const obj = { x: 1 };

 

  • Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : ์ผ๋‹จ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ถ”์ƒ ์—ฐ์‚ฐ์— ์˜ํ•ด Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ Object.prototype๊ณผ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์‚ฌ์ด์— ์—ฐ๊ฒฐ์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์ดํ›„ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋จ
const obj = new Obejct();
obj.x = 1;

 

  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ : new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถ”์ƒ ์—ฐ์‚ฐ์— ์˜ํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํ„ฐํ”ผ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด์™€ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์‚ฌ์ด์— ์—ฐ๊ฒฐ์ด ๋งŒ๋“ค์–ด์ง
function Person(name) {
    this.name = name;
}

const me = new Person('Lee');

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

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

 

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

// ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
Person.prototype.sayHello = function () {
    console.log(`Hi my name is ${this.name}`);
};

const me = new Person('Lee');

//hasOwnProperty๋Š” Object.prototype์˜ ๋ฉ”์„œ๋“œ
console.log(me.hasOwnProperty('name')); // true

Object.getPrototypeOf(me) === Person.prototype; // true
Object.getPrototypeOf(Person.prototype) === Object.prototype; // true

 

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

 

ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์˜ ์ตœ์ƒ์œ„์— ์œ„์น˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์–ธ์ œ๋‚˜ Object.prototype์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ํ”„๋กœํฌํƒ€์ž… ์ฒด์ธ์˜ ์ข…์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Object.prototype์˜ ํ”„๋กœํ† ํƒ€์ž…์ธ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์˜ ๊ฐ’์€ null ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๋”ฐ๋ผ ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํฌํƒ€์ž… ์ฒด์ธ์€ ์ƒ์†๊ณผ ํ”„๋กœํผํ‹ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

** ์Šค์ฝ”ํ”„ ์ฒด์ธ๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ์„œ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ์‹๋ณ„์ž์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ


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

์ƒ์† ๊ด€๊ณ„์— ์˜ํ•ด ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ์„ ํ”„๋กœํผํ‹ฐ ์„€๋„์ž‰์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

const Person = (function () {

    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
    function Person(name) {
        this.name = name;
    }
    
    // ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
    Person.prototype.sayHello = function () {
        console.log(`Hi my name is ${this.name}`);
    };
    
    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    return Person;
}());

const me = new Person('Lee');

// ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
me.sayHello = function () {
    console.log(`Hey my name is ${this.name}`);
};

// ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ. ํ”„๋กœํ† ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๊ฐ€๋ ค์ง
me.sayHello(); // Hey! my name is Lee

 

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

 

*์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

*์˜ค๋ฒ„๋กœ๋”ฉ : ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋™์ผํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž… ๋˜๋Š” ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ   

๊ตฌ๋ณ„ํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹

 

์ด์ฒ˜๋Ÿผ, ์‚ญ์ œ์‹œ์—๋„ ํ”„๋กœํผํ‹ฐ ์„€๋„์ž‰์ด ์ผ์–ด๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ณ€๊ฒฝ/์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


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

ํ”„๋กœํ† ํƒ€์ž…์„ ์ž„์˜์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ๋ถ€๋ชจ ๊ฐ์ฒด์ธ ํ”„๋กœํ† ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const Person = (function () {
    function Person(name) {
        this.name = name;
    }
    
    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ๊ต์ฒด
    Person.prototype = {
    	sayHello() {
            console.log(`Hi my name is ${this.name}`);
        }
    };
    
    return Person;
}());

const me = new Person('Lee');

// constructor ํ”„๋กœํผํ‹ฐ์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ํŒŒ๊ดด๋จ
console.log(me.constructor === Person); // false
console.log(me.constructor === Object); // true

 

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ Person.prototype์— ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ• ๋‹นํ•ด ํ”„๋กœํฌํƒ€์ž…์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ me ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด Person์ด ์•„๋‹ˆ๋ผ Object๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์ธ์Šคํ„ด์Šค์— ์˜ํ•œ ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด

์ธ์Šคํ„ด์Šค์˜ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

const me = new Person('Lee');

// ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ต์ฒดํ•  ๊ฐ์ฒด
const parent = {
    sayHello() {
        console.log(`Hi my name is ${this.name}`);
    }
};

Object.setPrototypeOf(me, parent); // me.__proto__ = parent; ์™€ ๊ฐ™์Œ

// constructor ํ”„๋กœํผํ‹ฐ์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ํŒŒ๊ดด๋จ
console.log(me.constructor === Person); // false
console.log(me.constructor === Object); // true

 

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด parent์˜ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

*์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๊ต์ฒดํ•˜๊ธฐ ๋ณด๋‹ค๋Š” "์ง์ ‘ ์ƒ์†"์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•˜๊ณ  ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


instanceof ์—ฐ์‚ฐ์ž

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

 

๊ฐ์ฒด instanceof ์ƒ์„ฑ์ž ํ•จ์ˆ˜

 

instanceof ์—ฐ์‚ฐ์ž๋Š” ์šฐ๋ณ€์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ์ฒด๊ฐ€ ์ขŒ๋ณ€ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์— ์กด์žฌํ•˜๋ฉด true๋กœ ํ‰๊ฐ€๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—” false๋กœ ํ‰๊ฐ€๋˜๋Š”  ์ดํ•ญ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

 

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

const me = new Person('Lee');

// Person.prototype๊ณผ Object.prototype์ด me ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์— ์กด์žฌํ•จ
console.log(me instanceof Person); // true
console.log(me instanceof Object); // true

// ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ๊ต์ฒดํ•  ๊ฐ์ฒด
const parent = {};

// ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด
Obejct.setPrototypeOf(me, parent);

// Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ parent ๊ฐ์ฒด๋Š” ์—ฐ๊ฒฐX
console.log(Person.prototype === parent); // false
console.log(parent.constructor === Person); // false

// parent ๊ฐ์ฒด๋ฅผ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype ํ”„๋กœํผํ‹ฐ์— ๋ฐ”์ธ๋”ฉ
Person.prototype = parent;

console.log(me instanceof Person); // true
console.log(me instanceof Object); // true

 

์œ„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด instanceof ์—ฐ์‚ฐ์ž๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ constructor ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ prototype์— ๋ฐ”์ธ๋”ฉ๋œ me ๊ฐ์ฒด๊ฐ€ Person๊ณผ Obejct์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


์ง์ ‘ ์ƒ์†

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

๋‹ค๋ฅธ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ถ”์ƒ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

Object.create(prototype,[propertiesObject])
  • prototype : ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ๊ฐ์ฒด. ์ฒซ ๋ฒˆ์žฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•„์ˆ˜
  • [propertiesObject] : ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์˜ต์…˜
  • ๋ฐ˜ํ™˜๊ฐ’ : ์ง€์ •๋œ ํ”„๋กœํ† ํƒ€์ž… ๋ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด
// obj -> Object.prototype -> null
let obj = Object.create(Object.prototype);
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true


const myProto = { x: 10 };

// ์ž„์˜์˜ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์†๋ฐ›๋Š”๋‹ค.
// obj -> myProto -> Object.prototype -> null
obj = Object.create(myProto);
console.log(obj.x); // 10
console.log(Object.getPrototypeOf(obj) === myProto); // true


// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name) {
    this.name = name;
}

// obj -> Person.prototype -> Object.prototype -> null
obj = Object.create(Person.prototype);
obj.name = 'Lee';
console.log(obj.name); // Lee
console.log(Object.getPrototypeOf(obj) === Person.prototype); // true

 

์ด์ฒ˜๋Ÿผ Object.create ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ง์ ‘์ ์œผ๋กœ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์—์„œ __proto__ ์— ์˜ํ•œ ์ง์ ‘ ์ƒ์†

ES6์—์„œ๋Š” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์—์„œ __proto__ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const myProto = { x : 10 };

const obj = { 
    y: 20,
    // ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์†๋ฐ›์Œ
    // obj -> myProto -> Object.prototype -> null
    __proto__: myProto
};

console.log(obj.x, obj.y); // 10, 20
console.log(Object.getPrototypeOf(obj) === myProto); // true

 

๋”ฐ๋ผ์„œ Object.create ๋ฉ”์„œ๋“œ์—์„œ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ •์  ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ

์ •์ (static) ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ฐธ์ดˆ/ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜ 
function Person(name){
    this.name = name;
}

// ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
Person.prototype.sayHello = function () {
    console.log(`Hi my name is ${this.name}`);
};

// ์ •์  ํ”„๋กœํผํ‹ฐ
Person.staticProp = 'static prop';

// ์ •์  ๋ฉ”์„œ๋“œ
Person.staticMethod = function () {
    console.log('staticMethod');
};

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•œ ์ •์  ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ฐธ์กฐ/ํ˜ธ์ถœ ๊ฐ€๋Šฅ
Person.staticMethod(); // staticMethod

const me = new Person('Lee');

// ์ •์  ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋กœ ์ฐธ์กฐ/ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅ
// ์ธ์Šคํ„ด์Šค๋กœ ์ฐธ์กฐ/ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ/๋ฉ”์†Œ๋“œ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์— ์กด์žฌํ•ด์•ผํ•จ
me.staticMethod(); // TypeError

 

์œ„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ์ธ ์ •์  ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •์  ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์†ํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 


ํ”„๋กœํผํ‹ฐ ์กด์žฌ ํ™•์ธ

๊ฐ์ฒด ๋‚ด์— ํŠน์ • ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

in ์—ฐ์‚ฐ์ž

key in object
  • key : ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด
  • object : ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„์‹

 

Reflect.has ๋ฉ”์„œ๋“œ

ES6์—์„œ ๋„์ž…๋œ ๋ฐฉ๋ฒ•์œผ๋กœ in ์—ฐ์‚ฐ์ž์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

Object.prototype.hasOwnProperty ๋ฉ”์„œ๋“œ

์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ ๊ฐ์ฒด ๊ณ ์œ ์˜ ํ”„๋กœํผํ‹ฐ ํ‚ค์ธ ๊ฒฝ์šฐ์—๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

( ์ƒ์† ๋ฐ›์€ ํ”„๋กœํ† ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ ํ‚ค์ธ ๊ฒฝ์šฐ์—” false๋ฅผ ๋ฐ˜ํ™˜)

 

const person = {
    name: 'Lee',
    address: 'Seoul'
};

console.log('name' in person); // true

// ES6์—์„œ ๋„์ž…๋œ Refelct.has ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•จ
console.log(Reflect.has(person, 'name')); // true

console.log(person.hasOwnProperty('name')); // true

ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ

for ... in ๋ฌธ

๊ฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์—ด๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

const Person = {
    name: 'Lee',
    address: 'Seoul'
};

for(const key in person) {
    console.log(key + ':' + person[key]);
}
// name: Lee
// address: Seoul

// toString์€ ์—ด๊ฑฐ๋˜์ง€ ์•Š์•˜์Œ
console.log('toString' in person); // true

 

์˜ˆ์ œ์™€ ๊ฐ™์ด for .... in๋ฌธ์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ƒ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ ์ค‘์—์„œ ํ”„๋กœํผํ‹ฐ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ [[Enumerable]]์˜ ๊ฐ’์ด true์ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์—ด๊ฑฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— name๊ณผ address๋งŒ ์—ด๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Object.keys/values/entries ๋ฉ”์„œ๋“œ

๊ฐ์ œ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋ฟ ์•„๋‹ˆ๋ผ ์ƒ์†๋ฐ›์€ ํ”„๋กœํผํ‹ฐ๋„ ์—ด๊ฑฐํ•˜๋Š” for ... in๋ฌธ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ์ฒด ์ž์‹ ์˜ ๊ณ ์œ  ํ”„๋กœํผํ‹ฐ๋งŒ ์—ด๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Object.keys/values/entries ๋ฉ”์„œ๋“œ๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

  • Object.keys : ๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œํ•œ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • Object.values : ๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜(ES8์—์„œ ๋„์ž…)
  • Object.entries : ๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ ํ‚ค์™€ ๊ฐ’์„ ์Œ์˜ ๋ฐฐ์—ด์„ ๋ฐฐ์—ด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜(ES8์—์„œ ๋„์ž…)
const person = {
    name: 'Lee',
    address: 'Seoul',
    __proto__: { age: 20 }
};

console.log(Object.keys(person)); // ["name", "address"]
console.log(Object.values(person)); // ["Lee", "Seoul"]
console.log(Object.entries(person)); // [["name", "Lee"], ["address", "Seoul"]]

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr