Skip to content

Latest commit

ย 

History

History
219 lines (163 loc) ยท 10.1 KB

constructor.md

File metadata and controls

219 lines (163 loc) ยท 10.1 KB

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

์ƒ์„ฑ์ž ํ•จ์ˆ˜(constructor)์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ

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

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

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

// ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ
const person = new Object();
// const person = {}; ์™€ ๋™์ผํ•œ ํšจ๊ณผ

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

์˜ค, ๊ทธ๋Ÿฐ๋ฐ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด ์ข€ ๋” ํŽธํ•ด๋ณด์ด์ฃ ? ๋ฐ˜๋“œ์‹œ ์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.


์ƒ์„ฑ์ž ํ•จ์ˆ˜

๋‹ค๋ฅธ ์„ ์–ธ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ , ๋ถˆํŽธํ•œ ๋ถ€๋ถ„์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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

    const circle1 = {
      radius: 5,
      getD() {
        return 2 * this.radius;
      },
    };
    const circle2 = {
      radius: 6,
      getD() {
        return 2 * this.radius;
      },
    };
    • {}๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ง๊ด€์ ์ด๋ฉฐ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ๋™์žƒํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹

    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
    function Circle(radius) {
      this.radius = radius;
      this.getD = function () {
        return 2 * this.radius;
      };
    }
    
    const circle1 = new Circle(5);
    const circle2 = new Circle(6);
    • ๋งˆ์น˜ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ(ํด๋ž˜์Šค)์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋“ฏ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์™€๋Š” ๋‹ฌ๋ฆฌ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •์˜ํ•œ ๋’ค, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. new ์—ฐ์‚ฐ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•˜์ฃ .

// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ
const circle3 = Circle(15);

// ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ Circle์€ ๋ฐ˜ํ™˜๋ฌธ(return)์ด ์—†์Šต๋‹ˆ๋‹ค.
console.log(circle3); // undefined

// ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ Circle ๋‚ด์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
console.log(radius);  // 15

this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๊ณ  ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†Œํ•œ ๊ฐœ๋…์ด ๋‹ค์‹œ ๊ณ ๊ฐœ๋ฅผ ๋‚ด๋ฐ€์—ˆ๋„ค์š”. this์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ์žฅ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด this๊ฐ€ ๋ฐ”์ธ๋”ฉ(Binding)๋˜๋Š” ๊ฐœ๋…์€ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

this

  • ๊ฐ์ฒด ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜(Self-Reference Variable)์ž…๋‹ˆ๋‹ค.

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

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

    // ํ•จ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
    // ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
    function foo() {
      console.log(this);
    }
    
    // 1. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ
    // ์ „์—ญ ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ € : window, Node.js : global ์ž…๋‹ˆ๋‹ค.
    foo();                      // window
    
    // ES6 ํ”„๋กœํผํ‹ฐ ์ถ•์•ฝ ํ‘œํ˜„
    const obj = { foo };
    // 2. ๋ฉ”์„œ๋“œ๋กœ์„œ ํ˜ธ์ถœ
    obj.foo();                  // obj
    
    // 3. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ
    const instance = new foo(); // instance

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

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

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

  1. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
    • ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ(์™„์„ฑ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค์—์š”)ํ•œ ๋’ค, this์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
    • ์ƒ์ •์ž ํ•จ์ˆ˜์— ๊ธฐ์ˆ ๋œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด this์— ๋ฐ”์ธ๋”ฉ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ์ธ์Šคํ„ด์Šค์— ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ณ ์ •๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ด๊ณ , ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค์— ๋ฐ”์ธ๋”ฉ ๋œ this๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ return์— ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๋ฉด ์•”๋ฌต์ ์ธ this ๋ฐ˜ํ™˜์ด ์ด ๋ฌด์‹œ๋˜๋ฏ€๋กœ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜, return this๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ด๋ก ์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?

function Circle(radius) {
  // 1. ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  this ์— ๋ฐ”์ธ๋”ฉ
  console.log(this); // Circle {}

  // 2. this์— ๋ฐ”์ธ๋”ฉ ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };

  // 3. this ๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ this ๋ฐ˜ํ™˜
  // ์ฐธ์กฐ ๊ฐ’ ๋ฐ˜ํ™˜์‹œ ์•”๋ฌต์  this ๋ฐ˜ํ™˜์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
  return {};

  // ์›์‹œ ๊ฐ’ ๋ฐ˜ํ™˜์‹œ ๋ฌด์‹œ๋˜๊ณ  ์•”๋ฌต์  this ๋ฐ˜ํ™˜์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  return 100;
}

const circle = new Circle(1);
console.log(circle); // Circle { radius: 1, getDiameter: [Function (anonymous)] }

๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Call]]๊ณผ [[Construct]]

์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ(Call)ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๊ฐ€ ๋“œ๋””์–ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.

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

์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function foo() {}

// 1. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ : [[Call]]์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
foo();

// 2. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ: [[Constructor]]๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
new foo();
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ : ํ•จ์ˆ˜ ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์ธ [[Call]] ํ˜ธ์ถœ
    • callable์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ : ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Construct]] ํ˜ธ์ถœ
    • constructor๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
    • [[Construct]]๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ non-constructor๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋กœ์„œ ๊ธฐ๋Šฅํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ callable์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Call]]์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์ฃ . ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ [[Constructor]]๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ฆ‰, ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” callable์ด๋ฉด์„œ constructor์ด๊ฑฐ๋‚˜ non-constructor์ž…๋‹ˆ๋‹ค.


construtor์™€ non-contructor์˜ ๊ตฌ๋ถ„

๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ• ๊นŒ์š”? ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ๋ฐ ๋ง์ด์ฃ .

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  • construtor : ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ํด๋ž˜์Šค(class)
  • non-construtor : ES6 ๋ฉ”์„œ๋“œ ์ถ•์•ฝํ‘œํ˜„, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow Function)

์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค! new ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ non-construtor์ด๋ฉด ์•ˆ๋˜๊ณ , construtor ํ•จ์ˆ˜๋ผ๋„ new ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด [[Call]]ํ˜ธ์ถœ์ด ๋˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ construtor๋ผ๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์ดํ•ด์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


new ์—ฐ์‚ฐ์ž

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[Construct]]๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋Š” constructor์ด์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ ! ์ด๋Š” ์œ„์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์„ค๋ช…ํ•œ ๊ฒƒ์ด๋‹ˆ ๊ฐ™์ด ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๋งž๋‹ฅ๋œจ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์น˜๋ช…์ ์ธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊ฐ•์ œํ•ด์•ผ ํ• ๊นŒ์š”?


new.target๊ณผ ์Šค์ฝ”ํ”„ ์„ธ์ดํ”„ ์ƒ์„ฑ์ž ํŒจํ„ด(Scope-safe Constructor)

๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ผ๋„ new ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ์—, ๋ฌด์กฐ๊ฑด [[Construct]]๋กœ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Circle(radius) {
  // 1. new.target ์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด new.target์€ undefined์ž…๋‹ˆ๋‹ค.
  if (!new.target) {
    return new Circle(radius);
  }

  // 2. new๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด this ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  // ES6์˜ new.target์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ ์Šค์ฝ”ํ”„ ์„ธ์ดํ”„ ์ƒ์„ฑ์ž ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  if (!(this instanceof Circle)) {
    return new Circle(radius);
  }
}