์ฃผ๋์ด ๊ฐ๋ฐ์์ ๊ฐ์ธ ๊ณต๋ถ ๊ณผ์ ์ ๊ธฐ๋กํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค.
- ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์์๋
์์
์ ์ฌ์ฉํ์ง๋ง - ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์์๋ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ํ(prototype)์ผ๋ก ์ผ๊ณ ์ด๋ฅผ ๋ณต์ (์ฐธ์กฐ)ํจ์ผ๋ก์จ ์์๊ณผ ๋น์ทํ ํจ๊ณผ๋ฅผ ์ป๋๋ค.
์ด๋ฐ ๋ ํนํ ๊ฐ๋ ์ธ ํ๋กํ ํ์ ์ ๋ํด ์์๋ณด์.
ํ๋กํ ํ์ ์ ๊ฐ๋ ์ดํด
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
๋ด๋ถ์ ์ ์ํ๋ฉด ๋ค๋ฅธ ๋ฐ์ดํฐํ์ ๋ ํ๋กํ ํ์ ์ฒด์ธ์ ํ๊ณ ์ฌ๋ผ์์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค. - ์ด๋ฐ ๋ฉ์๋๋ฅผ Static method๋ผ ํ๋ค.
โ๏ธ ๋ค์ค ํ๋กํ ํ์ ์ฒด์ธ
ํ๋กํ ํ์ ์ฒด์ธ์ 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
์ด ๋ฐฐ์ด์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํด์ฃผ๋ฉด ๋๋ค.
โจ tl;dr
- ์ด๋ค ์์ฑ์ ํจ์๋ฅผ
new
์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉดConstructor
์์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋๋ฐ,- ์ด ์ธ์คํด์ค์๋
__proto__
๋ผ๋,Constructor
์ptototype
ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ๋ถ์ฌ๋๋ค. __proto__
๋ ์๋ต ๊ฐ๋ฅํ ์์ฑ์ด๋ผ์,- ์ธ์คํด์ค๋
Constructor.ptototype
์ ๋ฉ์๋๋ฅผ ๋ง์น ์์ ์ ๋ฉ์๋์ธ ๊ฒ์ฒ๋ผ ํธ์ถํ ์ ์๋ค.
Constructor.ptototype
์๋constructor
๋ผ๋ ํ๋กํผํฐ๊ฐ ์๋๋ฐ, ์ด๋ ๋ค์ ์์ฑ์ ํจ์ ์์ ์ ๊ฐ๋ฆฌํจ๋ค.- ์ด ํ๋กํผํฐ๋ ์ธ์คํด์ค๊ฐ ์์ ์ ์์ฑ์ ํจ์๊ฐ ๋ฌด์์ธ์ง๋ฅผ ์๊ณ ์ ํ ๋ ํ์ํ ์๋จ์ด๋ค.
- ์ง๊ฐ์ผ๊ฐํ์ ๋๊ฐ์ ๋ฐฉํฅ, ์ฆ
__proto__
๋ฐฉํฅ์ ๊ณ์ ์ฐพ์๊ฐ๋ฉด ์ต์ข ์ ์ผ๋ก๋Object.ptototype
์ ๋๋ฌํ๊ฒ ๋๋ค.- ์ด๋ฐ ์์ผ๋ก
__proto__
์์์ ๋ค์__proto__
๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์ ํ๋กํ ํ์ ์ฒด์ด๋์ด๋ผ๊ณ ํ๋ฉฐ, - ์ด ํ๋กํ ํ์ ์ฒด์ด๋์ ํตํด ๊ฐ ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์์ ์ ๊ฒ์ฒ๋ผ ํธ์ถํ ์ ์๋ค.
- ์ด๋ ์ ๊ทผ ๋ฐฉ์์ ์์ ์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์๋ถํฐ ์ ์ฐจ ๋จผ ๋์์ผ๋ก ๋์๊ฐ๋ฉฐ, ์ํ๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ๊ฒ์์ ์ค๋จํ๋ค.
- ์ด๋ฐ ์์ผ๋ก
Object.ptototype
์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ฒ์ฉ์ ์ธ ๋ฉ์๋๋ง์ด ์กด์ฌํ๋ฉฐ- ๊ฐ์ฒด ์ ์ฉ ๋ฉ์๋๋ ์ฌ๋ ๋ฐ์ดํฐ ํ์
๊ณผ ๋ฌ๋ฆฌ
Object
์์ฑ์ ํจ์์ ์คํํฑํ๊ฒ ๋ด๊ฒจ ์๋ค.
- ๊ฐ์ฒด ์ ์ฉ ๋ฉ์๋๋ ์ฌ๋ ๋ฐ์ดํฐ ํ์
๊ณผ ๋ฌ๋ฆฌ
- ํ๋กํ ํ์ ์ฒด์ธ์ ๋ฐ๋์ 2๋จ๊ณ๋ก๋ง ์ด๋ค์ง๋ ๊ฒ์ด ์๋๋ผ ๋ฌดํ๋๋ก ์์ฑํ ์๋ ์๋ค.