๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

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

๋ฐ˜์‘ํ˜•

๐Ÿ€ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜

new ์—ฐ์‚ฐ์ž๋กœ Object ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ณ ,

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

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

//ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
person.name = 'daniel';
person.age = 29;
person.introduce = function(){
	console.log(`์ €๋Š” ${person.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${person.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
}

console.log(person); // {name: 'daniel', age: 29, introduce: ฦ’}
person.introduce(); // ์ €๋Š” daniel์ด๊ณ , ์ œ ๋‚˜์ด๋Š” 29์‚ด ์ž…๋‹ˆ๋‹ค.

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

 

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๊ณ , ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ๊ตณ์ด ์—†์–ด ๋ณด์ธ๋‹ค. 

์™œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์จ์•ผํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

๐Ÿ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜

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

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์— ์˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ์‹์€ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ํ”„๋กœํผํ‹ฐ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ธฐ์ˆ ํ•ด์•ผํ•œ๋‹ค๋Š” ์ทจ์•ฝํ•œ ๋ฌธ์ œ์ ์€ ์ง€๋‹Œ๋‹ค.

 

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

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

function Person(name, age){
	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
}

const noah = new Person('noah', 100);
const daniel = new Person('daniel', 29);

console.log(noah); // Person {name: 'noah', age: 100, introduce: ฦ’}
console.log(daniel); // Person {name: 'daniel', age: 29, introduce: ฦ’}
this?
this๋ž€ ๊ฐ์ฒด ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅด๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜๋‹ค. this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰ this ๋ฐ”์ธ๋”ฉ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค. 

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

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

function Person(name, age){
	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
}
// new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ.
// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋จ.
const noah = Person('noah', 100);

// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ Person์€ ๋ฐ˜ํ™˜๋ฌธ์ด ์—†์œผ๋ฏ€๋กœ ์•”๋ฌต์ ์œผ๋กœ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
console.log(noah); // undefined

// ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ Person ๋‚ด์˜ this๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 
name // 'noah'
age // 100
introduce() // ์ €๋Š” noah์ด๊ณ , ์ œ ๋‚˜์ด๋Š” 100์‚ด ์ž…๋‹ˆ๋‹ค.

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

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

  • ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ(ํ•„์ˆ˜)
  • ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”(์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€ ๋ฐ ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น)(์˜ต์…˜)
// ์ƒ์„ฑ์ž ํ•จ์ˆ˜
function Person(name, age){
	// ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
}
// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const daniel = new Person('daniel', 29); //์ด๋ฆ„์ด ๋‹ค๋‹ˆ์—˜์ด๊ณ , ๋‚˜์ด๊ฐ€ 29์ธ Person๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

์ƒ์„ฑ์ž ํ•จ์ˆ˜์—๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋ฐ, ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์•”๋ฌต์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ this ๋ฐ”์ธ๋”ฉ

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

function Person(name, age){

    console.log(this)// Person {}

	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
}

const daniel = new Person('daniel', 29);

์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”

์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๊ธฐ์ˆ ๋œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

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

 

์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜

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

function Person(name, age){
	// ์•”๋ฌต์ ์œผ๋กœ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  this์— ๋ฐ”์ธ๋”ฉ๋จ.

	// this์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”
    console.log(this)// Person {}

	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
    // ์™„์„ฑ๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ this๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ. Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์•”๋ฌต์ ์œผ๋กœ this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
const daniel = new Person('daniel', 29);
๋งŒ์•ฝ this๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด this๊ฐ€ ์•„๋‹Œ return๋ฌธ์— ๋ช…์‹œํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์›์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์›์‹œ ๊ฐ’์€ ๋ฌด์‹œ๋˜๊ณ  ์•”๋ฌต์ ์œผ๋กœ this๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. 

์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ this๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ํ›ผ์†ํ•˜๋ฏ€๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ return๋ฌธ์„ ์ƒ๋žตํ•ด์•ผ ํ•œ๋‹ค. 

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

ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๋ฐ˜๋ฉด ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

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

  • ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ ๋ฐ ๋ฉ”์„œ๋“œ
  • [[Environment]]
  • [[FormalParameters]]
  • [[Call]] : ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ, ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋จ.
  • [[Construct]] : ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ, ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋จ.

๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ [[call]]์„ ๊ฐ–๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ callable์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์ด๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด, ์ฆ‰ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. 

[[constructor]]๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” constructor, [[constructor]]๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ non-constructor๋ผ๊ณ  ํ•œ๋‹ค. 

๋ชจ๋“  ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ์— [[call]]์„ ๊ฐ–์ง€๋งŒ ๋ฐ˜๋“œ์‹œ [[constructor]]๋ฅผ ๊ฐ€์ง€์ง€๋Š” ์•Š๋Š”๋‹ค.

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•จ์ˆ˜ ์ •์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ

ํ•จ์ˆ˜๋ฅผ constructor, non-contructor๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. 

  • constructor: ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ, ํ•จ์ˆ˜ ํ‘œํ˜„์‹, ํด๋ž˜์Šค
  • non-constructor: ๋ฉ”์„œ๋“œ(es6์—์„œ ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„), ํ™”์‚ดํ‘œ ํ•จ์ˆ˜

ECMAScript ์‚ฌ์–‘์—์„œ ๋ฉ”์„œ๋“œ๋กœ ์ธ์ •ํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ข๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฉ”์„œ๋“œ๋ž€ ES6์˜ ๋ฉ”์„œ๋“œ ์ถ•์•ฝ ํ‘œํ˜„๋งŒ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์กฐ๊ธˆ ๋” ์ดํ•ด๊ฐ€ ์‰ฝ๊ฒ ๋‹ค. 

function foo(){};
const bar = function() {};
const baz = {
	x: function(){}
};

new foo(); // foo {}
new bar(); // bar {}
new baz.x(); // x {}

const arrow = () => {};

new arrow(); // Uncaught TypeError: arrow is not a constructor

const obj = {
	x(){}
}

new obj.x(); // Uncaught TypeError: obj.x is not a constructor

new ์—ฐ์‚ฐ์ž

์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ์ •์˜ํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ new ํ‚ค์›Œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด [[construct]]๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ ,

ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์‹œ ๋นˆ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž ์—†์ด ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด [[call]]์ด ํ˜ธ์ถœ๋˜๊ณ , 

์ƒ์„ฑ์ž ํ•จ์ˆ˜์•ˆ์— ์žˆ๋Š” this๋Š” window๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋ฉฐ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋Š” ์ „์—ญ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค. 

new.target

new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ ํ•จ์ˆ˜ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. new ์—ฐ์‚ฐ์ž ์—†์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ new.target์€ undefined๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ new์—†์ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ  new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

function Person(name, age){
	this.name = name;
    this.age = age;
    this.introduce = function(){
		return console.log(`์ €๋Š” ${this.name}์ด๊ณ , ์ œ ๋‚˜์ด๋Š” ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`)
	}
    
    if(!new.target){
    	return new Person(name, age);
    }
}

const daniel = Person('daniel', 29);

 

์ถœ์ฒ˜ : ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋”ฅ๋‹ค์ด๋ธŒ

๋ฐ˜์‘ํ˜•

'JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€