์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ๋ง์ ๊ฑธ ๊นจ์ฐ์ณค์ต๋๋ค. ํ์ง๋ง ์กฐ๊ธ ๊น๊ฒ ์์๋ด์ผ ํฉ๋๋ค. ์ด๋ฒ ์ฅ์ด ๋๋๋ฉด ์ฐ๋ฆฌ๋ ES6์์ ์ ์ด๋ฐ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋์ง ์ ์ ์์ด์!
๊ฐ์ฒด๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ด์ธ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์๊ณผ ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์ฅ๋จ์ ์ ์ดํด๋ณผ๊น์?
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 ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํธ์ถํ๋ฉด ์๋์ ๊ฐ์ด ํ๋ฆ ๋๋ค.
- ์ธ์คํด์ค ์์ฑ
๋ฐํ์ ์ด์
์ ์๋ฌต์ ์ผ๋ก ๋น ๊ฐ์ฒด๋ฅผ ์์ฑ(์์ฑ๋์ง ์์์ง๋ง ์ด ๋น ๊ฐ์ฒด๊ฐ ์์ฑ์ ํจ์๋ก ์์ฑํ ์ธ์คํด์ค์์)ํ ๋ค, this์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- ์ธ์คํด์ค ์ด๊ธฐํ
- ์์ ์ ํจ์์ ๊ธฐ์ ๋ ์ฝ๋๊ฐ ์คํ๋์ด this์ ๋ฐ์ธ๋ฉ๋ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ณ , ์์ฑ์ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ด๊ธฐ๊ฐ์ ์ธ์คํด์ค ํ๋กํผํฐ์ ํ ๋นํ์ฌ ์ด๊ธฐํํ๊ฑฐ๋ ๊ณ ์ ๊ฐ์ ํ ๋นํฉ๋๋ค.
- ์ธ์คํด์ค ๋ฐํ
- ์์ฑ์ ํจ์ ๋ด๋ถ์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ๋๋ด๊ณ , ์์ฑ๋ ์ธ์คํด์ค์ ๋ฐ์ธ๋ฉ ๋ 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)ํ ์ ์๋ ์ด์ ๊ฐ ๋๋์ด ๋ฑ์ฅํฉ๋๋ค.
ํจ์๋ ๊ฐ์ฒด์ด์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์๋ ๋ฌ๋ฆฌ ํธ์ถ
ํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ํจ์ ๊ฐ์ฒด๋ ์ผ๋ฐ ๊ฐ์ฒด์ ๋ด๋ถ ์ฌ๋กฏ๊ณผ ๋ด๋ถ ๋ฉ์๋๋ฅผ ํฌํจํ์ฌ ํจ์๋ก์ ๋์ํ๊ธฐ ์ํ ๋ด๋ถ ์ฌ๋กฏ([[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 : ํจ์ ์ ์ธ๋ฌธ, ํจ์ ํํ์, ํด๋์ค(class)
- non-construtor : ES6 ๋ฉ์๋ ์ถ์ฝํํ, ํ์ดํ ํจ์(Arrow Function)
์ ๋ฆฌํด๋ด
์๋ค! new
์ฐ์ฐ์๋ก ํธ์ถํ๋ ํจ์๊ฐ non-construtor์ด๋ฉด ์๋๊ณ , construtor ํจ์๋ผ๋ new
์ฐ์ฐ์๋ก ํธ์ถํ์ง ์์ผ๋ฉด [[Call]]
ํธ์ถ์ด ๋๋ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก construtor๋ผ๋ ๊ฒ์ ํ์คํ ์ดํด์ํค๊ธฐ ์ํด ์์ฑ์ ํจ์์ ์ด๋ฆ์ ํ์ค์นผ ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
new ์ฐ์ฐ์์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํ๋ฉด ํจ์ ๊ฐ์ฒด์ ๋ด๋ถ ๋ฉ์๋
[[Construct]]
๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ฆ, new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถ๋๋ ํจ์๋ constructor์ด์ด์ผ ํ๋ ๊ฒ์ด์ฃ ! ์ด๋ ์์ ๋ด์ฉ์ ์ถ๊ฐ์ ์ผ๋ก ์ค๋ช ํ ๊ฒ์ด๋ ๊ฐ์ด ์ดํดํ๋ฉด ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์ด๋ฐ ๋ฌธ์ ์ ์ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์์ฑ์ ํจ์๊ฐ new ์ฐ์ฐ์ ์์ด ํธ์ถ๋๋ ๊ฒฝ์ฐ ์น๋ช ์ ์ธ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฑธ ์ด๋ป๊ฒ ๊ฐ์ ํด์ผ ํ ๊น์?
๊ฐ๋ฐ์์ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ํด๊ฒฐ์ฑ ์ ๋๋ค.
์์ฑ์ ํจ์๋ผ๋ 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);
}
}