
์์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํฐ๋ด๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ ๋ฐ ์๋ค.
๊ต์ฅํ ๊ฐํธํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด์ง๋ง, ๋จ์ ์ด ์กด์ฌํ๋ค.
๋์ผ property๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค.
์ด๋ด ๋์ ๋ฆฌํฐ๋ด๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ต์ฅํ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ Object ์์ฑ์ ํจ์๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
(์ด์ธ์๋ ๋ค๋ฅธ built-in ์์ฑ์ ํจ์๋ค์ด ๋ช ๊ฐ ์๋ค.)
new ์ฐ์ฐ์์ ํจ๊ป Object ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด,
๋น ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐํํ๋ค.
์ด๋ ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋๋ ๊ฐ์ฒด๋ฅผ instance ๋ผ๊ณ ํ๋ค.
์ด ์์ฑ์ ํจ์๋ ๊ทธ๋ฅ ํจ์์ ๋ญ๊ฐ ๋ค๋ฅธ๊ฑธ๊น?
์ผ๋ฐ ํจ์์ ์์ฑ์ ํจ์์ ์ ์ ๋ถ๋ถ์ ๋ณ ๋ค๋ฅธ ์ฐจ์ด๊ฐ ์๋ค.
๊ทธ๋ฌ๋ new ์ฐ์ฐ์๋ก ํธ์ถํ์ ๋์ ์์ฑ์ ํจ์๋ก ๋์ํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
์์ฑ์ ํจ์๋ก ๋์ํ๋ค๋ ๊ฒ์, instance๋ฅผ ์์ฑํ๊ณ ,
์์ฑ๋ instance๋ฅผ ์ด๊ธฐํํด์ฃผ๋ ๊ฒ -์ด๊ธฐํ๋ ์ต์
์ฌํญ์ด๋ค- ์ ๋งํ๋ค.
๊ทธ๋ผ ์์ฑ์ ํจ์๋ ์ด๋ป๊ฒ instance ์์ฑํ๋ ๊ฑธ๊น?
JavaScript ์์ง์, ์๋ฌต์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํตํด instance๋ฅผ ์์ฑํ๊ณ ๋ฐํํ๋ค.
๊ทธ๋ฌ๋๊น ์๋ฌต์ ์ผ๋ก ๋น ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ, ์ด ๋น ๊ฐ์ฒด๊ฐ ๋ฐ๋ก ์์ฑ์ ํจ์๊ฐ ์์ฑํ instance์ด๋ค.
์ด instance๋ this์ ๋ฐ์ธ๋ฉ ๋๋ค.
๋ฐ์ธ๋ฉ์ด๋ ์๋ณ์์ ๊ฐ์ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ ๋งํ๋ค.
instance๊ฐ this์ ๋ฐ์ธ๋ฉ๋๋ค๋ ๊ฑด, this ์ this๊ฐ ๊ฐ๋ฆฌํฌ ๊ฐ์ฒด ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ ๋งํ๋ค.
๊ทธ ๋ค์์ ๊ฐ๋ฐ์์ ์์ญ์ด๋ค.
๊ฐ๋ฐ์๋ this์ ๋ฐ์ธ๋ฉ๋์ด ์๋ instance๋ฅผ ์ด๊ธฐํํ๋ค.
์ฆ instance์ property๋ method๋ฅผ ์ถ๊ฐํ๊ณ ,
์์ฑ์ ํจ์๊ฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ด๊ธฐ๊ฐ์ instance property์ ํ ๋นํ์ฌ ์ด๊ธฐํํ๊ฑฐ๋ ๊ณ ์ ๊ฐ์ ํ ๋นํ๋ค.
๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด, ์์ฑ๋ instance๊ฐ ๋ฐ์ธ๋ฉ๋ this๋ฅผ ์๋ฌต์ ์ผ๋ก ๋ฐํ ํ๋ค.
์ด๋ ๋ง์ฝ this๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฐํํ๋ฉด?
this๊ฐ ๋ฐํ๋์ง ๋ชปํ๊ณ , return ๋ฌธ์ ๋ช ์ํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
์ด ๊ฒฝ์ฐ, ์์ฑ์ ํจ์์ ๊ธฐ๋ณธ ๋์์ ํผ์ํ๊ธฐ ๋๋ฌธ์, return๋ฌธ์ ๋ฐ๋์ ์๋ตํ๋๋ก ํ์.
ํจ์ ๋ํ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ internal slot๊ณผ internal method๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ ๊ฐ์ฒด๋ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, ํจ์๋ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋๊น ํจ์ ๊ฐ์ฒด๋ internal slot, internal method๋ฅผ ํฌํจํด์,
ํจ์ ๊ฐ์ฒด ๋ง์ ์ํ [[Environment]] [[FormalParamenters]] ๋ฑ์ internal slot๊ณผ
[[Call]] [[Construct]] ์ ๊ฐ์ internal method๋ํ ์ถ๊ฐ๋ก ๊ฐ์ง๊ณ ์๋ค.
(์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ฉด [[Call]]์ด, new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก ํธ์ถ๋๋ฉด [[Construct]]๊ฐ ํธ์ถ๋๋ค.)
[[Call]]๋ฅผ ๊ฐ๋ ํจ์ ๊ฐ์ฒด๋ฅผ callable์ด๋ผ๊ณ ํ๊ณ , [[Construct]]๋ฅผ ๊ฐ์ง๋ฉด constructor, ๊ฐ์ง์ง ์์ผ๋ฉด non-constructor๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํจ์ ๊ฐ์ฒด๋ constructor์ผ ์๋ ์๊ณ non-constructor์ผ ์๋ ์๋ค.
์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๊น?
JavaScript ์์ง์, ํจ์๋ฅผ ์ ์ ํ๊ฐํ์ฌ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋,
ํจ์ ์ ์ ๋ฐฉ์์ ๋ฐ๋ผ ํจ์๋ฅผ constructor์ non-constructor๋ก ๊ตฌ๋ถํ๋ค.
๊ทผ๋ฐ ์ด ๋ฉ์๋๋ผ๋ ๊ฒ, ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ณด๋ค ์ข์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํจ์๋ฅผ property ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฐ๋ฐ non-constructor์ ๋ฉ์๋๋ ๋ฉ์๋ ์ถ์ฝ ํํ๋ง์ ์นญํ๋ ๋ง์ด๋ค.
๊ทธ๋ฌ๋๊น ์์ ๋ถ๋ฅ์ ๋ฐ๋ฅด๋ฉด, ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ผ๋ก ์ ์๋ ํจ์๋ง์ด constructor์ด๊ณ , ๋ฉ์๋ ์ถ์ฝ ํํ์ผ๋ก ์ ์ ๋ ํจ์๋ non-constructor๋ผ๋ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก new ์ฐ์ฐ์์ ๋ํด ์ ๋ฆฌํ์.
์ผ๋ฐ ํจ์์ ์์ฑ์ ํจ์๊ฐ์ ํ์์ ์ธ ์ฐจ์ด๋ ์๋ค๊ณ ํ๋ค.
new ์ฐ์ฐ์์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํ๋ฉด, ํด๋น ํจ์๋ ์์ฑ์ ํจ์๋ก ๋์ํ๋ค.
new ์ฐ์ฐ์ ์์ด ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ผ๋ฐ ํจ์๋ก ํธ์ถ๋๋ค.
์์ฑ์ ํจ์๊ฐ new ์ฐ์ฐ์ ์์ด ํธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด, Pascal case convention์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ ๋ง์ผ๋ก๋ ์ธ์ ๋ ์ค์๊ฐ ๋ฐ์ํ๋ค.
๋๋ฌธ์ ์ํ์ฑ์ ํผํ๊ธฐ ์ํด, ES6์์๋ new.target ์ง์์ ๋์
ํ๋ค.
this์ ์ ์ฌํ๊ฒ, constructor๋ ๋ชจ๋ ํจ์ ๋ด๋ถ์์ ์๋ฌต์ ์ธ ์ง์ญ ๋ณ์์ ๊ฐ์ด ์ฌ์ฉ๋๋ค.
(๋ฉํ ํ๋กํผํฐ๋ผ๊ณ ๋ถ๋ฆฐ๋ค.)
ํจ์ ๋ด๋ถ์์ new.target์ ์ฌ์ฉํ๋ฉด, new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
new ์ฐ์ฐ์์ ํจ๊ป ์์ฑ์ ํจ์๋ก์ ํธ์ถ๋๋ฉด, ํจ์ ๋ด๋ถ์ new.target์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค.
new ์ฐ์ฐ์ ์์ด ์ผ๋ฐ ํจ์๋ก์ ํธ์ถ๋ ํจ์ ๋ด๋ถ์ new target์ undefined์ด๋ค.
=> ํจ์ ๋ด๋ถ์์ new.target์ ์ฌ์ฉํด์
new ์ฐ์ฐ์์ ์์ฑ์ ํจ์๋ก์ ํธ์ถํ๋์ง ํ์ธํ๋ค.
๋ง์ฝ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ new ์ฐ์ฐ์์ ํจ๊ป ์ฌ๊ทํธ์ถ์ ํตํด ์์ฑ์ ํจ์๋ก์ ํธ์ถํ ์ ์๋ค.