kohigowild
JavaScript ํ๋กํ ํ์ ๊ณผ ํ๋กํ ํ์ ์ฒด์ธ ๋ณธ๋ฌธ
๐ง ํ๋กํ ํ์ ์ด๋?
์ผ๋ฐ์ ์ผ๋ก ํ๋กํ ํ์ (prototype)์ด๋ ์ํ์ด๋ผ๋ ๋ป์ ๊ฐ์ง๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค. ๋ชจ๋ ๊ฐ์ฒด๋ค์ด ๋ฉ์๋์ ์์ฑ๋ค์ ์์ ๋ฐ๊ธฐ ์ํ ํ ํ๋ฆฟ์ผ๋ก์จ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ค๋ ์๋ฏธ๋ค.
์ฐ๋ฆฌ๊ฐ ํจ์๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ ๋ ๊ทธ ๊ฐ์ฒด์๋ prototype์ด๋ผ๋ object๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค. prototype์๋ ๋ค์ constructor๋ผ๋ ๊ฐ์ฒด๊ฐ ์๋์ผ๋ก ์์ฑ๋์ด ์๋ก๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
Person.prototype.sum = function(){}
- ์์ ์ฝ๋๋ฅผ ํตํด์ prototype์ ํจ์๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ์์ ๋ ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด Person์ด๋ผ๋ object ์์ mitt, kim์ด ์๋ ๊ฒฝ์ฐ, mitt.sum()๊ณผ kim.sum() ๋ ๋ค ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ธ์คํด์ค ๊ฐ์ฒด์ key์ ์ ๊ทผํ ๋, ํด๋น ๊ฐ์ฒด์ key๊ฐ ์๋ค๋ฉด ๊ทธ ๋ค์์ผ๋ก ์์ ํ๋กํ ํ์ ์์ฑ์์ key๊ฐ ์๋์ง ํ์ธํ๋ค. ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ฐพ๊ธฐ ์ํด ๋ ์์์ ํ๋กํ ํ์ ์์ ์ฐพ๋๋ค. ์ด๊ฒ์ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ๊ณ ํ๋ค.
๐ง ํ๋กํ ํ์ ์ ๋ ์์ธํ ์์๋ณด์!
sort ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
์์์ arr๋ผ๋ ๋ณ์๋ฅผ ๋ฐฐ์ด ๋ฆฌํฐ๋ด๋ก ์์ฑํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ new Array()์ ๊ฐ์ด ์์ฑ์ ํจ์๋ก ์ ์ธํ ๊ฒ์ด๋ค. new ํค์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ ์ค ์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ํจ๊ป ์ฐ๋ ํค์๋์ด๋ค.
new ์์ฑ์ํจ์์ด๋ฆ()์ ํ์์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์ผํ ๊ตฌ์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋ผ ์ ์๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ์ธ์คํด์ค arr๋ ์์ฑ์ ํจ์์๊ฒ์ sort ๋ฉ์๋ ๋ฑ์ ์์ ๋ฐ๋๋ค. arr ๋ฐฐ์ด ๊ฐ์ฒด์ ์ํ์ Array์ด๋ค. ์ ํํ๋ Array == ํ๋กํผํฐ๊ฐ ์๋๋ผ Array๊ฐ ๊ฐ์ง๋ ํ๋กํ ํ์ ์ด๋ผ๋ ํน์ํ ํํ์ ๊ฐ์ฒด ํ๋กํผํฐ๋ฅผ ํตํด ์์ ๋ฐ๋๋ค.
์์ ์ฝ๋
const buzz = {
flying: true,
};
const woody = Object.create(buzz);
console.log(woody.flying); // true
woody๋ buzz์ prototype์ด ๋งํฌ๋์๋ค. woody ๋ด๋ถ์๋ flying์ด๋ผ๋ ํ๋กํผํฐ๊ฐ ์์ง๋ง ์ฐ๊ฒฐ๋ buzz์์ ํด๋น ํ๋กํผํฐ๋ฅผ ์ฐพ์ ๊ทธ ๊ฐ์ ๋ฐํํ ๊ฒ์ด๋ค.
const buzz = {
flying: true,
};
const woody = Object.create(buzz);
console.log(woody.flying); // true
for (let i in woody) {
console.log(`${i}๋ฅผ ๋ฐ๊ฒฌ!`); // flying๋ฅผ ๋ฐ๊ฒฌ!
}
๐ง Prototype Link VS Prototype Object
์๋ฐ์คํฌ๋ฆฝํธ์๋ Prototype Link์ Prototype Object๋ผ๋ ๊ฒ์ด ์กด์ฌํ๊ณ , ์ด ๋์ ํตํ์ด Prototype์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Prototype Object
function Toy() {} // ํจ์
const personObject = new Person(); // ํจ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑ
personObject ๊ฐ์ฒด๋ Person์ด๋ผ๋ ํจ์๋ก ์์ฑ๋ ๊ฐ์ฒด์ด๋ค. ์ธ์ ๋ ๊ฐ์ฒด๋ ํจ์์์ ์์๋๋ค. ํจ์๊ฐ ์ ์๋ ๋๋ ๋ ๊ฐ์ง ์ผ์ด ๋์์ ์ด๋ฃจ์ด์ง๋ค.
- ํด๋น ํจ์์ Constructor(์์ฑ์) ์๊ฒฉ ๋ถ์ฌ
- ํด๋น ํจ์์ Prototype Object ์์ฑ ๋ฐ ์ฐ๊ฒฐ
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ ํจ์๋ prototype์ด๋ผ๋ ์์ฑ์ ํตํด Prototype Object์ ์ ๊ทผํ ์ ์๋ค. Prototype Object๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์ ๊ฐ์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์ผ๋ก constructor์ __proto__๋ฅผ ๊ฐ์ง๋ค.
constructor๋ Prototype Object์ ๊ฐ์ด ์์ฑ๋์๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , [[Prototype]] = __proto__๋ Prototype Link์ด๋ค.
function Toys() {}
Toys.prototype.flying = true;
Toys.prototype.sleeping = false;
const buzz = new Toys();
const woody = new Toys();
console.log(woody.sleeping); // false
Prototype Link
Prototype ์์ฑ์ ํจ์๋ง ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ proto ์์ฑ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋น ์ง์์ด ๊ฐ์ง๊ณ ์๋ ์์ฑ์ด๋ค.
__proto__๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์กฐ์์ด์๋ ํจ์์ Prototype Object๋ฅผ ๊ฐ๋ฆฌํจ๋ค. buzz๋ Toys ํจ์๋ก๋ถํฐ ์์ฑ๋์์ผ๋ Toys ํจ์์ Prototype Object๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๐ง Prototype Chain
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋์ ์ ๊ทผ ์ ๊ฐ์ฒด ์์ ์ ๊ฒ๋ฟ๋ง ์๋๋ผ __proto__๊ฐ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ์ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ ๊ทผํ ์ ์๋ค.
- ์ฆ, ํน์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋ ์ ๊ทผ ์ ๋ง์ฝ ํ์ฌ ๊ฐ์ฒด์ ํด๋น ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด __proto__๊ฐ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ํ๋ ๊ฒ์ด ๋ฐ๋ก ํ๋กํ ํ์ ์ฒด์ธ์ด๋ค.
- ๋ชจ๋ ํ๋กํ ํ์ ์ฒด์ด๋์ ์ข ์ ์ Object.prototype์ด๋ค.
- ํ์ ๊ฐ์ฒด๋ ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์์ ๋ฐ๋ ๊ฒ์ด ์๋๋ผ ๊ณต์ ํ๋ค.
- ํด๋น ๊ฐ์ฒด์ ์๋ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ ๊ทผํ ๋ ํ๋กํ ํ์ ์ฒด์ด๋์ด ์ผ์ด๋๋ค.
์์ ๊ด์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ผํ ์์ฑ์๋ ๊ฐ์ฒด๋ฟ์ด๋ค. ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ [[prototype]]์ด๋ผ๋ ์๋ ์์ฑ์ ๊ฐ์ง๋๋ฐ ์์ ์ ํ๋กํ ํ์ ์ด ๋๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ ๊ฐ์ฒด์ ํ๋กํ ํ์ ๋ํ ํ๋กํ ํ์ ์ ๊ฐ์ง๊ณ ์๊ณ ์ด๊ฒ์ด ๋ฐ๋ณต๋๋ค. ๊ฒฐ๊ตญ null์ ํ๋กํ ํ์ ์ผ๋ก ๊ฐ์ง๋ ์ค๋ธ์ ํธ์์ ๋๋๋ค. null์ ๋ ์ด์์ ํ๋กํ ํ์ ์ด ์๋ค๊ณ ์ ์๋๋ฉฐ, ํ๋กํ ํ์ ์ฒด์ธ์ ์ข ์ ์ญํ ์ ํ๋ค.
๐ง Reference
https://hanamon.kr/javascript-ํ๋กํ ํ์ ๊ณผ-ํ๋กํ ํ์ ์ฒด์ธ/
https://developer.mozilla.org/ko/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
https://mygumi.tistory.com/m/312
https://velog.io/@adam2/์๋ฐ์คํฌ๋ฆฝํธ-Prototype-์๋ฒฝ-์ ๋ฆฌ
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM) (0) | 2022.11.16 |
---|---|
JavaScript ES6 ๋ชจ๋ (0) | 2022.10.29 |
JavaScript ํ(Queue), ์คํ(Stack), ํธ๋ฆฌ(Tree) (0) | 2022.10.20 |
JavaScript ์ ๊ท ํํ์(Regular Expression) (0) | 2022.10.16 |
JavaScript ๋ฐฐ์ด ๊ณ ์ฐจ ํจ์(Higher-Order Function) (0) | 2022.10.13 |