๊ฐ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์์ฑํ์ต๋๋ค
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค.
์์
์ ์ฌ์ฉํ์ง๋ง ์ด๋ฐ ๋ ํนํ ๊ฐ๋ ์ธ ํ๋กํ ํ์ ์ ๋ํด ์์๋ณด์.
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
์์ฑ์ ํจ์์ ์คํํฑํ๊ฒ ๋ด๊ฒจ ์๋ค.