๐Ÿ“– ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ

c_yjยท2022๋…„ 6์›” 26์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
14/42
post-thumbnail

โœ”๏ธ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

new ์—ฐ์‚ฌ์ž์™€ ํ•จ๊ป˜ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

// ๋นˆ ๊ฐ์ฒด์˜ ์ƒ์„ฑ
const person = new Object();

// ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
person.name = "Lee";
person.sayHello = function () {
  console.log('Hi! My name is ' + this.name)
};

console.log(person); // {name: "Lee", sayHello: f}
person.sayHello(); // Hi! My name is Lee

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ž€ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผํ•œ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด์™ธ์—๋„ String,Number,Boolean,Function,Array,Date,RegExp,Promise ๋“ฑ์˜ ๋นŒํŠธ์ธ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
๊ทธ๋‹ค์ง€ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

โœ”๏ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜

โ˜‘๏ธ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

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

const circle1 = {
  radius: 5,
  getDiameter() {
    return 2 * this.radius;
  }
};

console.log(circle1.getDiameter()); // 10

const circle2 = {
  radius: 10,
  getDiameter() {
    return 2 * this.radius;
  }
};

console.log(circle2.getDiameter()); // 20

โ˜‘๏ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์˜ ์žฅ์ 

์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์€ ๋งˆ์น˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Circle(radius){
  // ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  this.radius = radius;
  this.getDiameter = function() {
    return 2 * this.radius;
  };
}

// ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ
const circle1 = new Circle(5); // ๋ฐ˜์ง€๋ฆ„์ด 5์ธ Circle ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
const circle2 = new Circle(10); // ๋ฐ˜์ง€๋ฆ„์ด 10์ธ Circle ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20

โœ๏ธ this

this๋Š” ๊ฐ์ฒด ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋‹ค. this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰ this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’(this ๋ฐ”์ธ๋”ฉ)
์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์ „์—ญ ๊ฐ์ฒด
๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฐ์ฒด(๋งˆ์นจํ‘œ ์•ž์˜ ๊ฐ์ฒด)
์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€(๋ฏธ๋ž˜์—) ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋งŒ์•ฝ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.

โ˜‘๏ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ณผ์ •

์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ํ”„๋กœํผํ‹ฐ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ์„œ ๋™์ž‘ํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”(์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ด๊ณ , ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด๋‹ค.

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Circle(radius) {
  // ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
}

//์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const circle1 = new Circle(5); // ๋ฐ˜์ง€๋ฆ„์ด 5์ธ Circle ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์•”๋ฌต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค. new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ this ๋ฐ”์ธ๋”ฉ
    ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋นˆ ๊ฐ์ฒด, ์ฆ‰ ์ธ์Šคํ„ด์Šค๋Š” this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์ด ์ฒ˜๋ฆฌ๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹คํ–‰๋œ๋‹ค.

    โœ๏ธ๋ฐ”์ธ๋‹น
    ๋ฐ”์ธ๋”ฉ์ด๋ž‘ ์‹๋ณ„์ž์™€ ๊ฐ’์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋˜์–ด this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ฆ‰, this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค์— ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ณ ์ •๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

function Circle(radius) {
  // 1. ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  this์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
  // 2. this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
  // 3. ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ. Circle ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์•”๋ฌต์ ์œผ๋กœ this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}

โ˜‘๏ธ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Call]]๊ณผ [[Construct]]

ํ•จ์ˆ˜๋Š” ๊ฐฏ์ฒด์ด๋ฏ€๋กœ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

// ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋‹ค.
function foo() {}

// ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์—†๋‹ค.
foo.prop = 10;

// ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
foo.method = function () {
  console.log(this.prop);
};

foo.method(); // 10

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด์ง€๋งŒ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€๋Š” ๋‹ค๋ฅด๋‹ค. ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ์„ ์œ„ํ•œ [[Environment]], [[FormalParameters]] ๋“ฑ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ๊ณผ [[Call]] [[Construct]] ๊ฐ™์€ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

โ˜‘๏ธ constructor์™€ non-constructor์˜ ๊ตฌ๋ถ„

  • constructor : ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ํด๋ž˜์Šค
  • non-constructor : ๋ฉ”์„œ๋“œ(ES6 ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„), ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
// ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์ •์˜: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹
function foo() {}
const bar = function () {};
// ํ”„๋กœํผํ‹ฐ x์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น๋œ ๊ฒƒ์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋‹ค. ์ด๋Š” ๋ฉ”์„œ๋“œ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค..
const baz = {
  x: function () {}
};
// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋งŒ์ด constructor๋‹ค.
new foo(); // foo {}
new bar(); // bar {}
new baz.x(); // {}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ •์˜
const arrow = () ={};

new arrow(); // TypeError:

// ๋ฉ”์„œ๋“œ ์ •์˜ : ES6์˜ ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„๋งŒ ๋ฉ”์„œ๋“œ๋กœ ์ธ์ •ํ•œ๋‹ค.
const obj = {
  x() {}
};
new obj.x(); // TypeError:

โ˜‘๏ธ new ์—ฐ์‚ฐ์ž

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ์ •์˜ํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜
function add(x,y) {
  return x + y;
}

// ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ์ •์˜ํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ
let inst = new add();

// ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฐ˜ํ™˜๋ฌธ์ด ๋ฌด์‹œ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฐ˜ํ™˜๋œ๋‹ค.
console.log(inst); // {}

// ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜
function createUser(name, role) {
  return {name, role};
}

//์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ
inst = new createUser('Lee', 'admin');
// ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
console.log(inst); {name: "Lee", role: "admin"}

โ˜‘๏ธ new.target

์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์Šค์นผ ์ผ€์ด์Šค ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ์‹ค์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ„ํ—˜์„ฑ์„ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ES6์—์„œ๋Š” new.target์„ ์ง€์›ํ•œ๋‹ค.
ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ new.target์„ ์‚ฌ์šฉํ•˜๋ฉด new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ ํ•จ์ˆ˜ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. new ์—ฐ์‚ฐ์ž ์—†์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ undefined๋‹ค.

profile
FrontEnd Developer

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