์๋ฐ์คํฌ๋ฆฝํธ๋
Prototype
๊ธฐ๋ฐ ์ธ์ด์ด๋ค. ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์์๋์์
์ ์ฌ์ฉํ์ง๋งPrototype
๊ธฐ๋ฐ ์ธ์ด์์๋ ์ด๋ค ๊ฐ์ฒด๋ฅผPrototype
์ผ๋ก ์ผ๊ณ ์ด๋ฅผ ๋ณต์ ํจ์ผ๋ก์จ ์์๊ณผ ๋น์ทํ ํจ๊ณผ๋ฅผ ์ป๋๋ค.
- ์ด๋ค Class๋ ์์ฑ์ ํจ์๋ฅผ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด, Class์ constructor๋ ์์ฑ์ ํจ์ ๋ด๋ถ์์ ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๋ก์ด
์ธ์คํด์ค
๊ฐ ์์ฑ๋๋ค.- ์ด๋ ์ธ์คํด์ค์๋
__proto__
๋ผ๋ ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ๋ถ์ฌ๋๋๋ฐ, ์ด ํ๋กํผํฐ๋ Constructor์ prototype์ด๋ผ๋ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ค.
prototype์ ๊ฐ์ฒด์ด๋ค. ์ด๋ฅผ ์ฐธ์กฐํ๋ __proto__ ์ญ์ ๋น์ฐํ ๊ฐ์ฒด์ด๋ค.
prototype ๊ฐ์ฒด ๋ด๋ถ์๋ ์ธ์คํด์ค๊ฐ ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ์ ์ฅํ๋ค.
๊ทธ๋ฌ๋ฉด ์ธ์คํด์ค์์๋ ์จ๊ฒจ์ง ํ๋กํผํฐ์ธ __proto__์ ํตํด ์ด ๋ฉ์๋๋ค์ ์ ๊ทผํ ์ ์๊ฒ๋๋ค.
let Person = function (name) {
this.name = name;
};
Person.prototype.getName = function () {
return this.name;
};
let su = new Person("kiki");
console.log(su.__proto__.getName()); // undefined
console.log(su.getName()); // kiki
console.log(Person.prototype === su.__proto__); // true
class Animal {
constructor(age) {
this.age = age;
}
}
Animal.prototype.getAge = function () {
return this.age;
};
let an = new Animal(12);
console.log(an.__proto__.getAge()); // undefined
console.log(an.getAge()); // 12
console.log(Animal.prototype === an.__proto__); // true
์ instance.__proto__.๋ฉ์๋() ๋ฅผ ์คํํ๋๋ฐ undefined๊ฐ ์ถ๋ ฅ๋๋์ง ์๊ฐํด๋ณด์
์ด๋ค ํจ์๋ฅผ "๋ฉ์๋"๋ก์ ํธ์ถํ ๋๋ ๋ฉ์๋๋ช ๋ฐ๋ก ์์ ๊ฐ์ฒด๊ฐ this๊ฐ ๋๋ค.
๊ทธ๋ฌ๋๊น su.__proto__.getName()์์ getName() ํจ์ ๋ด๋ถ์์์ this๋ su๊ฐ ์๋๋ผ su.__proto__๋ผ๋ ๊ฐ์ฒด๊ฐ ๋๋ ๊ฒ์ด๋ค.
su.__proto__ ๊ฐ์ฒด ๋ด๋ถ์๋ name ํ๋กํผํฐ๊ฐ ์์ผ๋ฏ๋ก undefined๋ฅผ ๋ฐํํ๋ค.
su.__proto__.name = "kiki__proto__"; ๋ก name ํ๋กํผํฐ๋ฅผ ๋ง๋ ๋ค๋ฉด, console.log(su.__proto__.getName()); ์ถ๋ ฅ๊ฐ์ผ๋ก "kiki__proto__"๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
๊ด๊ฑด์ "this"์ด๋ค.
์ธ์คํด์ค ์์ฒด๊ฐ this๊ฐ ๋๊ธฐ ์ํด์ ์์์ su.getAge()๋ฅผ ์ถ๋ ฅํ๋๋ "kiki"๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฉ์๋ ์์ ๊ฐ์ฒด๊ฐ su๋ผ๋ ์ธ์คํด์ค ์์ฒด์ด๋ฏ๋ก "kiki"๊ฐ ๋์จ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด ์์ฑ์.prototype์ getName์ ์ ์ํ์๋๋ฐ ์ด๋ป๊ฒ prototype์ ์ฐธ์กฐํ๋ __proto__ ๋ฅผ ์๋ตํด์ su.getName()์ ์คํํ๋๋ฐ ๊ฐ์ด ์ ๋๋ก ๋์ฌ๊น?.
์ด๊ฒ์ ์ ์ด์ __proto__๊ฐ ์๋ต ๊ฐ๋ฅํ ํ๋กํผํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์๋๋ถํฐ ์๋ต์ด ๊ฐ๋ฅํ๋๋ก ์ ์๋ผ ์๋ค.
์ฆ, su.getName()์ su(.__proto__).getName()์ด๋ผ๊ณ ๋ณด๋ฉด๋๋ค.
__proto__๋ฅผ ์๋ตํ์ง ์์ผ๋ฉด this๋ su.__proto__๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง, ์๋ตํ๋ฉด su๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ ์ฝ๋ ์์ฝ:
ํ ๋ง๋๋ก this๊ฐ ๊ด๊ฑด์ด๋ค. su.__proto__๋ Person.prototype์ ์ฐธ์กฐํ๋ค. ๊ทธ๋์ getName()์ ํธ์ถํ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ su.__proto__.getName()์ ํ๋ฉด su.__proto__ ์์ฒด๊ฐ ํธ์ถ ๋ฉ์๋์ ๊ฐ์ฒด๊ฐ ๋๋๋ฐ su.__proto__๋ name ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์์์ undefined ์ถ๋ ฅ๋๋ค.
๊ทธ๋ ๋ค๋ฉด getName()์ ํธ์ถํ ๋ ๊ฐ์ฒด๊ฐ su๊ฐ ๋ผ์ผ "kiki"๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
prototype ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ __proto_๋ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ su.getName()์ด ๋ฐ๋ก ๊ฐ๋ฅํ๋ค.
์๋ ์ฌ์ง์ ๋ณด๋ฉด su๋ฅผ ์ ๋ ฅํด๋ prototype ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ ์ค ์์ฝ: new ์ฐ์ฐ์๋ก ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด -> ์ธ์คํด์ค๊ฐ ์์ฑ๋๋๋ฐ, ์ธ์คํด์ค์ ์๋ต ๊ฐ๋ฅํ ํ๋กํผํฐ์ธ __proto__๋ ์์ฑ์์ prototype์ ์ฐธ์กฐํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์์ ์๋์ผ๋ก ๊ฐ์ฒด์ธ prototype ํ๋กํผํฐ๋ฅผ ์์ฑํด ๋๋๋ฐ, ํด๋น ํจ์๋ฅผ ์์ฑ์ ํจ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ(new ์ฐ์ฐ์ ํธ์ถ), ๊ทธ๋ฌ๋ถํฐ ์์ฑ๋ ์ธ์คํด์ค์๋ ์จ๊ฒจ์ง ํ๋กํผํฐ __proto__๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค.
์ด ํ๋กํผํฐ๋ prototype ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ค.
์๋ต ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ฑ์ ํจ์๋ class์ prototype์ ์ด๋ค ๋ฉ์๋๋ ํ๋กํผํฐ๊ฐ ์๋ค๋ฉด ์ธ์คํด์ค์์๋ ๋ง์น ์์ ์ ๊ฒ์ฒ๋ผ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
๊ณ์ ๋ฐ๋ณต๋๋ ์๊ธฐ๋ฅผ ํ๋๋ฐ, ๊ทธ ๋งํผ ํ๋กํ ํ์ ์ ๊ฐ๋ ์ ํ ๋ฒ์ ์ดํด ํ๊ธฐ๊ฐ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค...
์ฐธ๊ณ ์๋ฃ :
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes
https://ko.javascript.info/prototypes
[์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ - ์ ์ฌ๋จ]