๐Ÿ“‹ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive | 19์žฅ ํ”„๋กœํ† ํƒ€์ž… (2)

waterglassesยท2022๋…„ 5์›” 1์ผ
0
post-thumbnail

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive ๋„์„œ์˜ 19์žฅ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

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

๊ฐ์ฒด๋Š” ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ• ๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ๋”๋ถˆ์–ด ์ƒ์„ฑ๋œ๋‹ค.

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

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

// 19-20
console.log(Person.prototype); // {contructor:f}

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

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

// 19-20
const Person = name => {
  this.name = name;
}

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

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

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

๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋„ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž…์ด ์ƒ์„ฑ๋œ๋‹ค. ๋ชจ๋“  ๋นŒํŠธ์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋œ๋‹ค.

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

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

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ‰๊ฐ€ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ถ”์ƒ ์—ฐ์‚ฐ OrdinaryObjectCreate๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋•Œ ์ถ”์ƒ ์—ฐ์‚ฐ OrdinaryObjectCreate์— ์ „๋‹ฌ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์€ Object.prototypedlek. ์ฆ‰, ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์€ Object.prototype์ด๋‹ค.

// 19-24
const obj = { x: 1 };

console.log(obj.constructor === Object); // true
console.log(obj.hasOwnProperty('x'); // true

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

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

// 19-24
const obj = new Object();
obj.x = 1;

console.log(obj.constructor === Object); // true
console.log(obj.hasOwnProperty('x'); // true

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

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

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

const me = new Person('Lee'); 

์‚ฌ์šฉ์ž ์ •์˜ Person๊ณผ ๋”๋ถˆ์–ด ์ƒ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… Person.prototype์˜ ํ”„๋กœํผํ‹ฐ๋Š” contructor๋ฟ์ด๋‹ค.

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

// 19-29
function Person(name){
  this.name = name;
}

Person.prototype.sayhello = function () {
  console.log(`My name is ${this.name}`);
}

const me = new Person('Lee');

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

me ๊ฐ์ฒด๋Š” hasOwnProperty๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๊ฒƒ์€ me ๊ฐ์ฒด๊ฐ€ Person.prototype ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Object.prototype๋„ ์ƒ์†๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

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

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

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

// 19-34
// ์ข…์ ์—์„œ๋„ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
console.log(me.foo); // undefined
  • ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์€ ํ”„๋กœํผํ‹ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฉ”ํ„ฐ๋‹ˆ์ฆ˜
  • ์Šค์ฝ”ํ”„์ฒด์ธ์€ ์‹๋ณ„์ž ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜

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

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

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

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

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

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

const me = new Person('Lee');

1์—์„œ Person.prototype์— ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ• ๋‹นํ–ˆ๋‹ค. ์ด๋Š” Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ต์ฒดํ•œ ๊ฒƒ์ด๋‹ค.

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

// 19-42
const Person = (function () {
  function Person(name) {
    this.name = name;
  }
  
  Person.prototype = {
    // constructor ํ”„๋กœํผํ‹ฐ์™€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๊ฐ„์˜ ์—ฐ๊ฒฐ ์„ค์ •
    constructor: Person,
  	sayHello() {
      console.log(`Hi My name is ${this.name}`);
    }
  };
  
  return Person;
}());

const me = new Person('Lee');

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

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

// 19-43
function Person(name){
  this.name = name;
}

const me = new Person('Lee');

const parent = {
  sayhello(){
    console.log(`My name is ${this.name}`);
  }
}

// 1. me ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์„ parent ๊ฐ์ฒด๋กœ ๊ตํ™˜ํ•œ๋‹ค.
Object.setPrototypeOf(me, parent);
// ์œ„ ์ฝ”๋“œ๋Š” me.__proto__ = parent;์™€ ๊ฐ™์ด ๋™์ž‘

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

์ด์ฒ˜๋Ÿผ ํ”„๋กœํ† ํƒ€์ž… ๊ต์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฝค๋‚˜ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํ† ํƒ€์ž…์€ ์ง์ ‘ ๊ต์ฒดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

19.10 instanceof ์—ฐ์‚ฐ์ž

instanceof ์—ฐ์‚ฐ์ž๋Š” ์ดํ•ญ ์—ฐ์‚ฐ์ž๋กœ์„œ ์ขŒ๋ณ€์— ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž, ์šฐ๋ณ€์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‹๋ณ„์ž๋ฅผ ํ”ผ์—ฐ์‚ฐ์ž๋กœ ๋ฐ›๋Š”๋‹ค.(๊ฐ์ฒด instanceof ์ƒ์„ฑ์ž ํ•จ์ˆ˜)

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

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

19.11 ์ง์ ‘ ์ƒ์†

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

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

Object.create ์žฅ์ 

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

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

// 19-55
const myProto = { x: 10 };
const obj = {
  y: 20,
  __proto__ : myProto
}

// obj => myPtoyo => Object.prototype => null

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

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

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

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

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

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

const me = new Person('Lee');

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

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

Object.create ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ด๊ณ , Object.prototype.hasOwnProperty๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ •์  ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

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

19.13.1 in ์—ฐ์‚ฐ์ž

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

// 19-59
const person = {
  name: 'Lee',
  address: 'Seoul'
};

// person ๊ฐ์ฒด์— name ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
console.log('name' in person);    // true
// person ๊ฐ์ฒด์— address ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
console.log('address' in person); // true
// person ๊ฐ์ฒด์— age ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
console.log('age' in person);     // false

in ์—ฐ์‚ฐ์ž ๋Œ€์‹  ES6์—์„œ ๋„์ž…๋œ Reflect.has๋ฉ”์„œ๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. in๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

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

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

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

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

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

19.14.1 for ... in ๋ฌธ

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

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

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

1) Object.keys
๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

// 19-72
const person = {
  name: 'Lee',
  address: 'Seoul',
  __proto__: { age: 20 }
};

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

2) Object.values
๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

3) Object.entries
๊ฐ์ฒด ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์˜ ๋ฐฐ์—ด์„ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

Object.entries(person).forEach(([key, value]) => console.log(key, value));
/*
name Lee
address Seoul
*/

Ref

  • ์ด์›…๋ชจ ์ €, โŒœ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep DiveโŒŸ, ์œ„ํ‚ค๋ถ์Šค
profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€