Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””

[๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””] JavaScript์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋™์ž‘ ๊ณผ์ •

๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

๐Ÿ“‘ JavaScript์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋™์ž‘ ๊ณผ์ •

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜(Constructor Function)๋Š” ๊ฐ์ฒด๋ฅผ ์ฐ์–ด๋‚ด๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

์˜›๋‚ ์—๋Š” class ๋ฌธ๋ฒ•์ด ์—†์—ˆ์–ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ function์„ ์ƒ์„ฑ์ž์ฒ˜๋Ÿผ ์ผ๊ณ ,

์ง€๊ธˆ๋„ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” new ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ๋œฏ์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 


๐Ÿงญ ์ „์ฒด ํ๋ฆ„ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ

new Person("์†Œ์—ฐ", 24) ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์•„๋ž˜์˜ ๋‹จ๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

  • ์ƒˆ๋กœ์šด ๋นˆ ๊ฐ์ฒด({ }) ์ƒ์„ฑ
  • ์ด ์ƒˆ ๊ฐ์ฒด์™€ Person.prototype์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
  • Person ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด์„œ this๋ฅผ ์ƒˆ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • this.name = "์†Œ์—ฐ" ์ฒ˜๋Ÿผ ์†์„ฑ์„ ๋ถ™์—ฌ์ค€๋‹ค.
  • ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ this (๋ฐฉ๊ธˆ ๋งŒ๋“  ์ƒˆ ๊ฐ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๊ฒฐ๊ณผ์ ์œผ๋กœ Person { name: "์†Œ์—ฐ", age: 24 } ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๊ฐ ๋‹จ๊ณ„๋ฅผ ์•„๋ž˜์—์„œ ๋” ์ž์„ธํžˆ ํ™•์ธํ•ด๋ณด์ž.

 


๐ŸŸฅ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์„ ์–ธ

๊ด€๋ก€์ ์œผ๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. (ํŒŒ์Šค์นผ ์ผ€์ด์Šค)

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

 

์ด Person ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ธฐ๊ธด ํ–ˆ์ง€๋งŒ, new์™€ ํ•จ๊ป˜ ์“ฐ๋ฉด ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 


๐ŸŸง new๋กœ ํ˜ธ์ถœํ•˜๊ธฐ

const p1 = new Person("์†Œ์—ฐ", 24);
console.log(p1); // Person { name: "์†Œ์—ฐ", age: 24 }

 

์—ฌ๊ธฐ์„œ new ๋ผ๋Š” ํ‚ค์›Œ๋“œ์˜ ์˜๋ฏธ๋Š” '๋‚˜ ๊ฐ์ฒด์ข€ ๋งŒ๋“ค์–ด์ค˜'๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์ฆ‰, Person์„ ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์— ๊ฐ’์„ ์ฑ„์›Œ์ฃผ๋Š” ํ๋ฆ„์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

 

 


๐ŸŸจ ๋‚ด๋ถ€ ๋™์ž‘

1) ์ƒˆ ๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ

๋จผ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ { } ๊ฐ™์€ ์ƒˆ๋กœ์šด ๋นˆ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

์ด ๊ฐ์ฒด๊ฐ€ ๊ณง ์ธ์Šคํ„ด์Šค(์˜ˆ์ œ์—์„œ๋Š” p1)์ด ๋  ์˜ˆ์ •์ด๋‹ค.

 

 

2) ํ”„๋กœํ† ํƒ€์ž… ์—ฐ๊ฒฐ

1๋ฒˆ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ๊ทธ๋ƒฅ ๋น„์–ด์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋ถ€๋ชจ ์„ค๋ช…์„œ ๊ฐ™์€ ๊ฑฐ๋ฅผ ๋ถ™์—ฌ๋†“๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ๋ฐ”๋กœ Person.prototype ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋˜ ๊ฒƒ์ด๋‹ค.

const p1 = new Person("์†Œ์—ฐ", 24);
console.log(Object.getPrototypeOf(p1) === Person.prototype); // true

 

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ์— p1์ด ์–ด๋–ค ์†์„ฑ์„ ๋ชป ์ฐพ๊ณ  ์žˆ์œผ๋ฉด,

"ํ˜น์‹œ ๋„ค ๋ถ€๋ชจ(Person.prototype)์— ์žˆ๋‹ˆ?"ํ•˜๊ณ  ๊ฑฐ๊ธฐ ๊ฐ€์„œ ์•Œ์•„์„œ ์ฐพ์•„๋ณด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์š”๋Ÿฐ๊ฑฐ๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

3) this ๋ฐ”์ธ๋”ฉ

์ด์ œ Person("์†Œ์—ฐ", 24) ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ,

์ด๋•Œ this๊ฐ€ ๋ฐฉ๊ธˆ ๋งŒ๋“  ์ƒˆ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ์ž๋™์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

function Person(name, age) {
  // ์—ฌ๊ธฐ์„œ this === ์ƒˆ๋กœ ๋งŒ๋“  ์ธ์Šคํ„ด์Šค
  this.name = name;
  this.age = age;
}

 

์ฆ‰, this.name = name ์ด๋ผ๋Š” ๊ฒƒ์€

์ƒˆ ๊ฐ์ฒด ์•ˆ์— name์ด๋ผ๋Š” ์†์„ฑ์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

4) ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ ์ดˆ๊ธฐํ™”

์ด์ œ ์ด ๋‹จ๊ณ„์—์„œ ๊ฐ์ฒด ์•ˆ์— ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์‹ค์ œ๋กœ ๋ถ™์ด๊ฒŒ ๋œ๋‹ค.

this.name = name;
this.age = age;

 

 

๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜(๋ฉ”์„œ๋“œ)๋Š” ์–ด๋–ป๊ฒŒ ๋ถ™์ผ๊นŒ?

์—ฌ๊ธฐ์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

4-1) ์ƒ์„ฑ์ž ์•ˆ์— ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ

function BadPerson(name) {
  this.name = name;
  this.sayHi = function () {
    return `Hi, ${this.name}`;
  };
}

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์˜ ๋‹จ์ ์€ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

4-2) prototype์— ์ž‘์„ฑํ•˜๊ธฐ

Person.prototype.sayHi = function () {
  return `Hi, ${this.name}`;
};

const p1 = new Person("์†Œ์—ฐ", 24);
console.log(p1.sayHi()); // "Hi, ์†Œ์—ฐ"

 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋งŒ์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

5) ๋ฐ˜ํ™˜ ๊ทœ์น™

์ด์ œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ๋ฐ, ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐ˜ํ™˜์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

์ด๋•Œ return์ด ๋”ฐ๋กœ ์—†๋‹ค๋ฉด this๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ,

return {...} ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด ๊ทธ๊ฒŒ ์šฐ์„ ์‹œ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ return 10 ๊ฐ™์€ ์›์‹œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด, ์ด๋Š” ๋ฌด์‹œ๋˜๊ณ  ๊ทธ๋ƒฅ this๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

function A() { this.v = 1; }
console.log(new A()); // A { v: 1 }

function B() { this.v = 2; return { x: 99 }; }
console.log(new B()); // { x: 99 } ← this ๋ฌด์‹œ

function C() { this.v = 3; return 7; }
console.log(new C()); // C { v: 3 } ← ์›์‹œ๊ฐ’ ๋ฌด์‹œ

 

 


๐ŸŸฉ ์ผ๋ฐ˜ ํ˜ธ์ถœ๊ณผ์˜ ์ฐจ์ด์ 

์ผ๋ฐ˜ ํ˜ธ์ถœ๊ณผ์˜ ์ฐจ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

const x = Person("์†Œ์—ฐ"); // โŒ ๊ทธ๋ƒฅ ํ˜ธ์ถœ
console.log(x);           // undefined
console.log(globalThis.name); // ๋ธŒ๋ผ์šฐ์ €: "์†Œ์—ฐ" (์ „์—ญ ์˜ค์—ผ ์œ„ํ—˜)
                             // Node (strict): TypeError ๋ฐœ์ƒ ๊ฐ€๋Šฅ

const y = new Person("์†Œ์—ฐ"); // โœ… new ํ˜ธ์ถœ
console.log(y); // Person { name: "์†Œ์—ฐ" }

 

์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ทธ๋ƒฅ ํ˜ธ์ถœํ•˜๋ฉด this๊ฐ€ ์ „์—ญ(๋˜๋Š” undefined)์„ ๊ฐ€๋ฆฌ์ผœ์„œ ๋ฒ„๊ทธ๋‚˜ ์ „์—ญ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,

new๋Š” ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ this ๋ฐ”์ธ๋”ฉ์„ ๋ณด์žฅํ•ด์ค€๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

(๊ทธ๋ž˜์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ new์™€ ํ•จ๊ป˜ ์จ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.)

 

 

๋˜ํ•œ, ์‹ค์ œ๋กœ new๋ฅผ ๋นผ๋จน์—ˆ์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

function SafePerson(name) {
  if (!new.target) return new SafePerson(name); // new ์—†์ด ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „
  this.name = name;
}
function SafePerson(name) {
  if (!(this instanceof SafePerson)) return new SafePerson(name);
  this.name = name;
}

 

 


๐Ÿ“š ๊ฒฐ๋ก 

์ด๋ฒˆ์— ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๋™์ž‘ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ

๋‹จ์ˆœํžˆ new๋ฅผ ๋ถ™์ด๋А๋ƒ ๋งˆ๋А๋ƒ์˜ ์ฐจ์ด๊ฐ€ ์ด๋ ‡๊ฒŒ ํฐ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ƒˆ์‚ผ ๋А๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๊ทธ๋™์•ˆ์€ ๊ทธ๋ƒฅ new๋ฅผ ๋ถ™์ด๋ฉด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค๊ณ ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ,

์‚ฌ์‹ค ๊ทธ ์•ˆ์—์„œ๋Š” '๋นˆ ๊ฐ์ฒด ์ƒ์„ฑ -> ํ”„๋กœํ† ํƒ€์ž… ์—ฐ๊ฒฐ -> this ๋ฐ”์ธ๋”ฉ -> ์†์„ฑ ์ดˆ๊ธฐํ™” -> ๋ฐ˜ํ™˜ ๊ทœ์น™ ์ ์šฉ'

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ๋‚˜๋‹ˆ, ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ๋จธ๋ฆฟ์†์— ํ›จ์”ฌ ๋ช…ํ™•ํ•œ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ธ์ƒ ๊นŠ์—ˆ๋˜ ๊ฒŒ, ๊ทธ๋ƒฅ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ new ํ˜ธ์ถœ์—์„œ this๊ฐ€ ์ „์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋А๋ƒ, ์ƒˆ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค๋А๋ƒ์˜ ์ฐจ์ด๋Š”

์‹ค๋ฌด์—์„œ ๋ฒ„๊ทธ๋กœ ์ด์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค.

์•ž์œผ๋กœ๋Š” ๊ผญ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ this๊ฐ€ ์–ด๋””๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ•ญ์ƒ ์‹ ๊ฒฝ์จ์ค˜์•ผ๊ฒ ๋‹ค.

 

์˜ค๋Š˜ ํฌ์ŠคํŒ… ๋‚ด์šฉ์ด ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ง ํฅ๋ฏธ๋กœ์› ์–ด์„œ

์•ž์œผ๋กœ๋„ ์ถ”์ƒ์ ์œผ๋กœ 'new๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ~'ํ•˜๊ณ  ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

๊ทธ ๋‚ด๋ถ€์˜ ๋™์ž‘ ๊ณผ์ •์„ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊พธ์ค€ํžˆ ๊ฐ€์ ธ์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•