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}
ํจ์๋ ๊ฐฏ์ฒด์ด๋ฏ๋ก ์ผ๋ฐ ๊ฐ์ฒด์ ๋์ผํ๊ฒ ๋์ํ ์ ์๋ค. ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
// ํจ์๋ ๊ฐ์ฒด๋ค.
function foo() {}
// ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์๋ค.
foo.prop = 10;
// ํจ์๋ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฉ์๋๋ฅผ ์์ ํ ์ ์๋ค.
foo.method = function () {
console.log(this.prop);
};
foo.method(); // 10
ํจ์๋ ๊ฐ์ฒด์ด์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์๋ ๋ค๋ฅด๋ค. ์ผ๋ฐ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์์ง๋ง ํจ์๋ ํธ์ถํ ์ ์๋ค. ๋ฐ๋ผ์ ํจ์ ๊ฐ์ฒด๋ง์ ์ํ [[Environment]], [[FormalParameters]] ๋ฑ์ ๋ด๋ถ ์ฌ๋กฏ๊ณผ [[Call]] [[Construct]] ๊ฐ์ ๋ด๋ถ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ๊ฐ์ง๊ณ ์๋ค.
// ์ผ๋ฐ ํจ์ ์ ์: ํจ์ ์ ์ธ๋ฌธ, ํจ์ ํํ์
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:
// ์์ฑ์ ํจ์๋ก์ ์ ์ํ์ง ์์ ์ผ๋ฐ ํจ์
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 ์ฐ์ฐ์ ์์ด ํธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ค์นผ ์ผ์ด์ค ์ปจ๋ฒค์ ์ ์ฌ์ฉํ๋ค ํ๋๋ผ๋ ์ค์๋ ์ธ์ ๋ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฌํ ์ํ์ฑ์ ํํผํ๊ธฐ ์ํด ES6์์๋ new.target์ ์ง์ํ๋ค.
ํจ์ ๋ด๋ถ์์ new.target์ ์ฌ์ฉํ๋ฉด new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋์๋์ง ํ์ธํ ์ ์๋ค. new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋๋ฉด ํจ์ ๋ด๋ถ์ new.target์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค. new ์ฐ์ฐ์ ์์ด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ ํจ์ ๋ด๋ถ์ new.target์ undefined๋ค.