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

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

Prototype ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ๊ฐ์˜ ๊ฐ์ฒด์— ๊ณต์œ  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

__proto__ vs prototype ํ”„๋กœํผํ‹ฐ

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

var foo = new Person('Lee');

console.dir(Person); // prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
console.dir(foo); // prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋‹ค.
  • prototype

    1. ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค

    2. ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค. ์ฆ‰, ์ƒ์„ฑ์ž ํ•จ์ˆ˜(๋˜๋Š” ํด๋ž˜์Šค)๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณตํ†ต ์ •๋ณด๋ฅผ ๋‹ด ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    console.log(Person.prototype === foo.__proto__);

    => foo๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋Š” ๋ถ€๋ชจ์ธ Person ๊ฐ์ฒด(์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด) ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

  • __proto__ === [[Prototype]]์ž…๋‹ˆ๋‹ค.

    1. ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    2. ์ž์‹ ์˜ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

    console.log(Person.__proto__ === Function.prototype);

    => Function.prototype์€ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋กœ์„œ ๋ถ€๋ชจ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

constructor

constructor: prototype(๊ณต์œ  ์ •๋ณด ์ œ๊ณต ๊ฐ์ฒด)์„ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ต๋‹ˆ๋‹ค.

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

var foo = new Person('Lee');

// Person.prototype ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” Person() ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
console.log(Person.prototype.constructor === Person);

// foo ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” Person() ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
console.log(foo.constructor === Person);

// Person() ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” Function() ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ด๋‹ค.
console.log(Person.constructor === Function);

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

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

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

var person = {
  name: 'Lee',
  gender: 'male',
  sayHello: function () {
    console.log('Hi! my name is ' + this.name);
  },
};

console.log(person.__proto__ === Object.prototype); // โ‘  true
console.log(Object.prototype.constructor === Object); // โ‘ก true
console.log(Object.__proto__ === Function.prototype); // โ‘ข true
console.log(Function.prototype.__proto__ === Object.prototype); // โ‘ฃ true

prototypeChain

  1. Person ๊ฐ์ฒด์™€ Object.prototype์˜ ๊ด€๊ณ„
  • person ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ์ด ๋˜์—ˆ๊ณ  ๊ณต์œ  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋Š” Object.prototype ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  1. Object.prototype์˜ Object ๊ด€๊ณ„
  • Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด Object.prototype(๊ณต์œ  ์ •๋ณด ๊ฐ์ฒด)์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  1. Object์™€ Function.prototype์˜ ๊ด€๊ณ„
  • Object๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Object ์ž์ฒด๋„ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, Function.prototype์„ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฆ‰, Object.__proto__ === Function.prototype์ด ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค
  1. Function.prototype๊ณผ Object.prototype์˜ ๊ด€๊ณ„