
๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ์ต๋๋ค
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค.
์์์ ์ฌ์ฉํ์ง๋ง ์ด๋ฐ ๋ ํนํ ๊ฐ๋ ์ธ ํ๋กํ ํ์ ์ ๋ํด ์์๋ณด์.
Constructor, prototype, instance
์ด ๊ทธ๋ฆผ์ ์ข ๋ ๊ตฌ์ฒด์ ์ธ ํํ๋ก ๋ฐ๊พธ๋ฉด,

์ด๋ฐ ๊ทธ๋ฆผ์ด ๋๋ค. ์์ ์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ ๋ณด์.
Constructor๋ฅผ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉดConstructor์์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๋ก์ด ์ธ์คํด์คinstance๊ฐ ์์ฑ๋๋คinstance์๋ __proto__๋ผ๋ ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ๋ถ์ฌ๋๋๋ฐ,Constructor์ prototype๋ผ๋ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ค.๋ชจ๋ ๊ฐ์ฒด๋ค์ด ๋ฉ์๋์ ์์ฑ๋ค์ ์์ ๋ฐ๊ธฐ ์ํ ํ ํ๋ฆฟ์ผ๋ก์จ ํ๋กํ ํ์ ๊ฐ์ฒด(prototype object)๋ฅผ ๊ฐ์ง๋ค๋ ์๋ฏธ
prototype์ __proto__๋ผ๋ ํ๋กํผํฐ์ ๊ด๊ณ๊ฐ ํ๋กํ ํ์
์ ํต์ฌ์ด๋ค.
prototype์ ๊ฐ์ฒด์ด๋ค. ์ด๋ฅผ ์ฐธ์กฐํ๋ __proto__(dunder proto: ๋๋ ํ๋กํ ) ์ญ์ ๊ฐ์ฒด์ด๋ค.prototype ๊ฐ์ฒด ๋ด๋ถ์๋ ์ธ์คํด์ค๊ฐ ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ์ ์ฅํ๋ค.__proto__ ๊ฐ์ฒด๋ฅผ ํตํด ์ด ๋ฉ์๋๋ค์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.| ์ฐธ๊ณ ๋ก, |
|---|
| ES5.1 ๋ช ์ธ์๋ proto๊ฐ ์๋๋ผ [[prototype]]์ด๋ผ๋ ๋ช ์นญ์ผ๋ก ์ ์๋์ด ์๋ค. ๋ช ์ธ์๋ instance.proto์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉํ์ง ์๊ณ , ์ค์ง Object.getPrototypeOf(instance)/Reflelect.getPrototypeOf(instance)๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋๋ก ์ ์ํ๋ค. |
์ค๋ฌด์์๋ ๊ฐ๊ธ์ __proto__๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ฅผ ๊ถ์ฅ. ๋์ Object.getPrototypeOf()/Object.create() ๋ฑ์ ์ด์ฉํ๋๋ก ํ์. |

์์ ๋ฅผ ํตํด ์ดํดํด๋ณด์.
const Person = (name) => {
this._name = name;
};
Person.prototype.getName = () => {
return this._name;
};
Person์ ์ธ์คํด์ค๋ __proto__ ํ๋กํผํฐ๋ฅผ ํตํด getName์ ํธ์ถํ ์ ์๋ค.
const april = new Person('april');
april.__proto__.getName(); // (1) undefined
instance์ __proto__๊ฐ Constructor์ prototype ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ๊ฒฐ๊ตญ ๋์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ธฐ ๋๋ฌธ์ด๋ค.
(1) ๋ค๋ง, ์ฌ๊ธฐ์ undefined๊ฐ ๋ฐํ๋ ์ด์ ๋ this์ ๋ฐ์ธ๋ฉ ๋ ๋์์ด ์๋ชป๋๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ด๋ค ํจ์๋ฅผ ๋ฉ์๋๋ก์ ํธ์ถํ ๋๋ ๋ฉ์๋๋ช
๋ฐ๋ก ์์ ๊ฐ์ฒด๊ฐ ๊ณง this๊ฐ ๋๋ค. ๐ฏ Javascript this
__proto__ ๊ฐ์ฒด์ name ํ๋กํผํฐ๊ฐ ์๋ค๋ฉด?
const april = new Person('april');
april.__proto__._name = 'april__proto__';
april.__proto__.getName(); // (1) april__proto__
๊ด๊ฑด์ this์ธ๋ฐ, this๋ฅผ ์ธ์คํด์ค๋ก ํ๋ ๋ฐฉ๋ฒ์ __proto__ ์์ด ์ธ์คํด์ค์์ ๊ณง๋ฐ๋ก ๋ฉ์๋๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
const april = new Person('april');
april.getName(); // (1) april
์ด ํํ์ด ๊ฐ๋ฅํ ์ด์ ๋ __proto__๊ฐ ์๋ต ๊ฐ๋ฅํ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฆฌํ์๋ฉด,
new์ฐ์ฐ์๋กConstructor๋ฅผ ํธ์ถํ๋ฉดinstance๊ฐ ๋ง๋ค์ด์ง๋๋ฐ,
์ดinstance์ ์๋ต ๊ฐ๋ฅํ ํ๋กํผํฐ์ธ__proto__๋Constructor์prototype์ ์ฐธ์กฐํ๋ค.
์ด๋ฒ์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฐ์ด์ ํตํด ์ดํดํด๋ณด์.

๋ฐฐ์ด์ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ์ฌ์ฉํ ์ ์์๋ ์ด์ ์ ๋ํด ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
์ด๋ค ๋ฐ์ดํฐ์ __proto__ ํ๋กํผํฐ ๋ด๋ถ์ ๋ค์ __proto__ ํ๋กํผํฐ๊ฐ ์ฐ์์ ์ผ๋ก ์ด์ด์ง ๊ฒ์ ํ๋กํ ํ์
์ฒด์ธ(prototype chain)์ด๋ผ ํ๊ณ ,
์ด ์ฒด์ธ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ๊ฒ์ํ๋ ๊ฒ์ ํ๋กํ ํ์
์ฒด์ด๋(prototype chaining)์ด๋ผ๊ณ ํ๋ค.
ํ๋กํ ํ์
์ฒด์ด๋(prototype chaining)์
์ด๋ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์
__proto__๋ฅผ ๊ฒ์ํด์ ์์ผ๋ฉด ๊ทธ ๋ฉ์๋๋ฅผ ์คํํ๊ณ , __proto__๋ฅผ ๊ฒ์ํด์ ์คํํ๋ ์์ผ๋ก ์งํํ๋ค.| ์ฐธ๊ณ ๋ก, ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋(method overriding)์ ๋์ผํ ๋งฅ๋ฝ์ด๋ค. |
|---|
| ๋ฉ์๋ ์์ ๋ฉ์๋๋ฅผ ์์ด์์ ๋ค๋ ํํ. |
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ฉ์๋๋ฅผ ์ฐพ๋ ๋ฐฉ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์์ธ ์์ ์ ํ๋กํผํฐ๋ฅผ ๊ฒ์ํ๊ณ , ์์ผ๋ฉด ๊ทธ ๋ค์์ผ๋ก ๊ฐ๊น์ด ๋์์ธ __proto__๋ฅผ ๊ฒ์ํ๋ ์์๋ก ์งํ๋๋ค. '๊ต์ฒด'ํ๋ ํํ๋ผ๋ฉด ์๋ณธ์๋ ์ ๊ทผํ ์ ์๋ ํํ๊ฐ ๋๊ฒ ์ง๋ง '์น๋, ๋ฎ์ด ์์ด' ํํ๋ผ๋ฉด ์๋ณธ์ด ์๋์ ์ ์ง๋๊ณ ์๊ณ ์๋ณธ์ ์ ๊ทผํ ์ ์๋ค. |

prototype์ ๋ฐ๋์ ๊ฐ์ฒด์ด๋ค.Object.prototype์ด ์ธ์ ๋ ํ๋กํ ํ์
์ฒด์ธ์ ์ต์๋จ์ ์กด์ฌํ๋ค.Object.prototype์ ์๋ ๋ฉ์๋๋ ์ด๋ ์๋ฃํ์ด๋ ์ธ์คํด์ค์์ ๋ฐ๋ก ํธ์ถํ ์ ์๋ค.prototype ์์ ์ ์ํ์ง ์๋๋ค. ๊ฐ์ฒด์์๋ง ์ฌ์ฉํ ๋ฉ์๋๋ฅผ prototype ๋ด๋ถ์ ์ ์ํ๋ฉด ๋ค๋ฅธ ๋ฐ์ดํฐํ์
๋ ํ๋กํ ํ์
์ฒด์ธ์ ํ๊ณ ์ฌ๋ผ์์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.ํ๋กํ ํ์ ์ฒด์ธ์ 2๋จ๊ณ ์ด์์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด,
__proto__๊ฐ ๊ฐ๋ฆฌํค๋ ๋์, ์ฆ ์์ฑ์ ํจ์์prototype์ด
์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์์ ์์ฑ์ ํจ์์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ๋ ํด์ฃผ๋ฉด ๋๋ค.
const Grade = () => {
const ars = Array.prototype.slice.call(arguments);
for( var i = 0; i < args.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
const g = new Grade(100, 80); // (1)
(1) ๋ณ์ g๋ Grade์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
Grade์ ์ธ์คํด์ค๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ๊ฐ๊ฐ ์์๋๋ก ์ธ๋ฑ์ฑํด์ ์ ์ฅํ๊ณ length ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋ ๋ฑ์ผ๋ก ๋ฐฐ์ด์ ํํ๋ฅผ ์ง๋์ง๋ง, ๋ฐฐ์ด์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ด๋ค.
g { 0: 100, 1: 80, length: 2 }
๋ฐ๋ผ์, ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด, ์ธ์คํด์ค g์ __proto__, ์ฆ Grade.prototype์ด ๋ฐฐ์ด์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํด์ฃผ๋ฉด ๋๋ค.
new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉดConstructor์์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋๋ฐ, __proto__๋ผ๋, Constructor์ ptototype ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ๋ถ์ฌ๋๋ค.__proto__๋ ์๋ต ๊ฐ๋ฅํ ์์ฑ์ด๋ผ์, Constructor.ptototype์ ๋ฉ์๋๋ฅผ ๋ง์น ์์ ์ ๋ฉ์๋์ธ ๊ฒ์ฒ๋ผ ํธ์ถํ ์ ์๋ค.Constructor.ptototype์๋ constructor๋ผ๋ ํ๋กํผํฐ๊ฐ ์๋๋ฐ, ์ด๋ ๋ค์ ์์ฑ์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค. __proto__ ๋ฐฉํฅ์ ๊ณ์ ์ฐพ์๊ฐ๋ฉด ์ต์ข
์ ์ผ๋ก๋ Object.ptototype์ ๋๋ฌํ๊ฒ ๋๋ค. __proto__ ์์์ ๋ค์ __proto__๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์ ํ๋กํ ํ์
์ฒด์ด๋์ด๋ผ๊ณ ํ๋ฉฐ, Object.ptototype์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์์ ์ฌ์ฉํ ์ ์๋ ๋ฒ์ฉ์ ์ธ ๋ฉ์๋๋ง์ด ์กด์ฌํ๋ฉฐObject ์์ฑ์ ํจ์์ ์คํํฑํ๊ฒ ๋ด๊ฒจ ์๋ค.