JavaScript : ํ๋กํ ํ์ ์ ์ดํด >
JavaScript๋ ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌ(cloning)ํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ์ ์ธ์ด์ด๋ค. ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด๋ ๊ฐ์ฒด ์ํ์ธ ํ๋กํ ํ์ ์ ์ด์ฉํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
1. ํจ์์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ ์ดํด
1) ํจ์ ์ ์
- ํจ์ ๋ฉค๋ฒ๋ก prototype์์ฑ์ด ์๋ค. ์ด ์์ฑ์ ๋ค๋ฅธ ๊ณณ์ ์์ฑ๋ ํจ์์ด๋ฆ์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
- ํ๋กํ ํ์ ๊ฐ์ฒด์ ๋ฉค๋ฒ์ธ constructor์์ฑ์ ํจ์๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
function Person(){}
2) Personํจ์๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ
- Person ํจ์์ prototype์์ฑ์ด ์ฐธ์กฐํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ new๋ผ๋ ์ฐ์ฐ์์ Personํจ์๋ฅผ ํตํด ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ํ์ด ๋๋ ๊ฐ์ฒด์ด๋ค.
- ์ํ ๊ฐ์ฒด๋ด์ prototype์์ฑ์ด ์๋ค๋ฉด ์ธ์คํด์ค ์์ฑ์ด ๊ฐ๋ฅํ๊ณ , ์๋ค๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ๋ชปํ๋ค.
- ์์ฑ๋ ๊ฐ์ฒด ์์๋ proto(๋นํ์ค) ์์ฑ์ด ์๋ค. proto ์์ฑ์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ํด ์ฌ์ฉ๋ ์ํ์ธ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์จ์ ๋งํฌ๋ก ์ฐธ์กฐํ๋ ์ญํ ์ ํ๋ค.
function Person(){}
# ์ธ์คํด์ค ์์ฑ
var joon = new Person();
var jisoo = new Person();
2. ํ๋กํ ํ์ ๊ฐ์ฒด
ํ๋กํ ํ์ ๊ฐ์ฒด๋ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ์ํ ์ํ์ด ๋๋ ๊ฐ์ฒด์ด๋ค. ๊ฐ์ ์ํ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๊ณตํต์ผ๋ก ์ฐธ์กฐํ๋ ๊ณต๊ฐ์ด๋ค.
- ๊ฐ์ ์ํ์ ๋ณต์ฌ๋ก ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ถ๊ฐ๋ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
# ํจ์ ์์ prototype์์ฑ์ ์ด์ฉํด ๋ฉค๋ฒ ์ถ๊ฐ
Person.prototype.getType = function(){
return "์ธ๊ฐ";
};
console.log(joon.getType); //์ธ๊ฐ
console.log(jisoo.getType); //์ธ๊ฐ
- ํ๋กํ ํ์ ๊ฐ์ฒด์ ๋ฉค๋ฒ๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ, ๊ฐ์ฒด ๋๋ ํจ์์ prototype์์ฑ์ ํตํด ์ ๊ทผํ ์ ์๋ค. ํ์ง๋ง, ํ๋กํ ํ์ ๊ฐ์ณ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐ, ์์ , ์ญ์ ํ ๊ฒฝ์ฐ, ํจ์ ์์ prototype์์ฑ์ ํตํด ์ ๊ทผํด์ผ ํ๋ค.
Person.prototype.getType = function(){
return "์ธ๊ฐ";
};
joon.getType = function(){
return "์ฌ๋";
};
console.log(joon.getType); //์ฌ๋
console.log(jisoo.getType); //์ธ๊ฐ
jisoo.age = 25;
console.log(joon.age); //undefined
console.log(jisoo.age); //25
joon๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ getType()์ ํธ์ถํ๋ฉด ํ๋กํ ํ์ ๊ฐ์ฒด์ getType()์ ํธ์ถํ ๊ฒ์ด ์๋๋ผ, joon๊ฐ์ฒด์ ์ถ๊ฐ๋ getType()์ ํธ์ถํ ๊ฒ์ด๋ค.
- ํ๋กํ ํ์ ๊ฐ์ฒด์ ๋ฉค๋ฒ๋ฅผ ์์ ํ ๊ฒฝ์ฐ๋ ๋ฉค๋ฒ ์ถ๊ฐ์ ๊ฐ์ด ํจ์์ prototype์์ฑ์ ์ด์ฉํ์ฌ ์์ ํ๋ค.
Person.prototype.getType = function(){
return "์ฌ๋";
};
console.log(jisoo.getType()); //์ฌ๋
3. ํ๋กํ ํ์
ํ๋กํ ํ์ ์ ํฌ๊ฒ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ prototype ์์ฑ๊ณผ ๊ฐ์ฒด ๋ฉค๋ฒ์ธ proto ์์ฑ์ด ์ฐธ์กฐํ๋ ์จ์ ๋งํฌ ๋๊ฐ์ง๋ก ํด์๋๋ค.
- ํจ์์ ๋ฉค๋ฒ์ธ prototype ์์ฑ์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์์ฑ์ด๋ค. ํจ์์ new์ฐ์ฐ์๊ฐ ๋ง๋ ์์ฑํ ๊ฐ์ฒด์ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค์ด์ง ๊ฐ์ฒด ์์ __proto__ ์์ฑ์ ์์ ์ ๋ง๋ค์ด๋ธ ์ํ์ธ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์จ๊ฒจ์ง ๋งํฌ๋ก์จ ํ๋กํ ํ์ ์ ์๋ฏธํ๋ค. ์ด ์จ๊ฒจ์ง ๋งํฌ๊ฐ ์์ด ํ๋กํ ํ์ ๊ฐ์ฒด ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
4. ํ๋กํ ํ์ ์ฒด์ธ
ํน์ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํ๋กํผํฐ์ ์ ๊ทผํ๊ณ ์ํ ๋, ํด๋น ๊ฐ์ฒด์ ์ ๊ทผํ๋ ค๊ณ ํ๋ ํ๋กํผํฐ๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ํ๋กํ ํ์ ๋งํฌ([[Prototype]] ํ๋กํผํฐ)๋ฅผ ๋ฐ๋ผ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ํ๋ค. ์ด๋ฅผ ํ๋กํ ํ์ ์ฒด์ธ์ด๋ผ ํ๋ค.
function Ultra(){}
Ultra.prototype.ultraProp = true;
function Super(){}
Super.prototype = new Ultra();
function Sub(){}
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp); //true
์ ์ฝ๋์์ ์์ฑ์ Sub๋ฅผ ํตํด์ ๋ง๋ค์ด์ง ๊ฐ์ฒด o๊ฐ Ultra์ ํ๋กํผํฐ ultraProp์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ prototype ์ฒด์ธ์ผ๋ก Sub์ Ultra๊ฐ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค.
- ๊ฐ์ฒด o์์ ultraProp๋ฅผ ์ฐพ๋๋ค.
- ์๋ค๋ฉด Sub.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
- ์๋ค๋ฉด Super.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
- ์๋ค๋ฉด Ultra.prototype.ultraProp๋ฅผ ์ฐพ๋๋ค.
prototype๋ ๊ฐ์ฒด์ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ์ฒด์ธ์ ์ญํ ์ ํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ด๊ณ๋ฅผ prototype chain์ด๋ผ๊ณ ํ๋ค.
โป ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ
1. ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ด์ฉ
var o = {};
2. new์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์์ฑ
var o = new Sub();
1๋ฒ ๋ฐฉ๋ฒ์ ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ 2๋ฒ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์์ด์ผ ํ ๊ธฐ๋ณธ์ ์ธ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ง๊ฒ ๋๋ค.
'๐ฐ ์ธ์ด > JS - ๋น๊ธฐ๋ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
for()๊ณผ forEach() (0) | 2021.05.24 |
---|---|
ํจ์ ํ๋กํผํฐ - call, apply/ bind (0) | 2021.05.24 |
new ์ฐ์ฐ์ (0) | 2021.05.17 |
๋ฐ์ดํฐ ํ์ (0) | 2021.05.17 |
๋ณ์ ์ ์ธ (var, let, const) (0) | 2021.05.16 |