
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋ค. ์๋ ์์๋ฅผ ํตํด ์ดํด๋ณด์.
์ฐธ์กฐ 1. ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ์ง์ ์ฐธ์กฐ.
๋์ฒด๋ก ์ผ๋ฐ์ ์ด ๋ฐฉ๋ฒ์ด ์๋๊ณ ๋ฐ๋์งํ ๋ฐฉ๋ฒ์ด ์๋๋ค.
์ฐธ์กฐ 2 & 3. ์์ฑ์ ํจ์
ํจ์ ๋ชธ์ฒด์ ์ ์ธํ ํ๋กํผํฐ๊ฐ ์์ง ์์ฑํ ์ธ์คํด์ค๋ฅผ ์ ์ ์๋ค.
new ์ฐ์ฐ์ ์์ฑ์ ํจ์๋ฅผ ํธ์ถํด์ผ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ธ์คํด์ค ์์ฑ ์ ์ ์์ฑ์ ํจ์๋ฅผ ์ ์ํด์ผํ๋ค.
// ๊ฐ์ฒด
const cart = {
total: 0,
addTotal(num){
// ์ฐธ์กฐ 1
return cart.total += num;
}
}
console.log(cart.addTotal(10)); // 10
// ์์ฑ์ ํจ์
function Cart(num) {
// ์ฐธ์กฐ 2
????.total = num;
}
Cart.prototype.addTotal = function (num) {
return (????.total += num);
};
// ์ฐธ์กฐ 3
const cart2 = new Cart(5);
๐ง ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ์์ ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์, ์์ฑ์ ํจ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์์ฑํ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํน์ํ ์๋ณ์๊ฐ ํ์ํจ์ ์ ์ ์๋ค.
// ๊ฐ์ฒด ๋ฆฌํฐ๋ด
const cart = {
total: 0,
list: [],
addItem(newItem){
// this๋ก ๊ฐ์ฒด ๋ด๋ถ์ ํ๋กํผํฐ ์ ๊ทผ.
this.list.push(newItem);
this.total += newItem.price;
},
getTotal(){
return this.total;
}
}
cart.addItem({ name: 'apple', price: 1000 });
cart.addItem({ name: 'banana', price: 2500 });
console.log(cart.getTotal()); // 3500
| ํจ์ ํธ์ถ ๋ฐฉ์ | this ๋ฐ์ธ๋ฉ |
|---|---|
| ์ผ๋ฐ ํจ์ | window |
| ํ์ดํ ํจ์ | ์์ ์ค์ฝํ์ this |
| ๋ฉ์๋ ํธ์ถ | ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒดย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย |
| ์์ฑ์ ํจ์ ํธ์ถ | ์์ฑํ ์ธ์คํด์ค |
| Function.prototype.apply/call/bind ๋ฉ์๋์ ์ํ ๊ฐ์ ํธ์ถ | ์ธ์์ ์ํด ๊ฒฐ์ |
์์ ๋ด์ฉ ์ค ์ธ๋ถ์ ์ผ๋ก ์ดํด๋ณผ ํญ๋ชฉ์ด ์๋๋ฐ ๋ฉ์๋ ๋ด์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ ๋์ด๋ค. ์ฝ๋ฐฑ ํจ์๊ฐ ์ผ๋ฐ ํจ์์ด๊ณ ๋ด๋ถ์ this๋ฅผ ํธ์ถํ๋ค๋ฉด ์ด๋ ์์ ํ์ ๊ฐ์ด ์ ์ญ์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
| ํจ์ | ํน์ง |
|---|---|
| apply callย ย ย ย ย ย ย ย | ๋ณธ์ง์ ์ธ ๊ธฐ๋ฅ์ ํจ์ ํธ์ถ. ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ ํน์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ ํจ์์ this์ ๋ฐ์ธ๋ฉ. |
| bind | ํจ์๋ฅผ ํธ์ถํ์ง ์๋๋ค. this ๋ฐ์ธ๋ฉ์ด ๊ต์ฒด๋ ํจ์๋ฅผ ์๋กญ๊ฒ ์์ฑํด ๋ฐํ. |
this๋ ํญ์ ์ด๋ ค์ด ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค. this๊ฐ ํธ์ถ ์์ ์ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ธ๋ฐ ์ด๋ก ์ ์๊ณ ๋ ๊ฐ์ฒด ๋ด์์ this๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์์์น ๋ชปํ๋ ๋ฌธ์ ์ ์ด ์๊ธฐ๊ธฐ๊ณ ๋จธ๋ฆฟ์์ด ๋ณต์กํด์ง๋ค. ๊ทธ๋ ๊ธฐ์ ๊ฐ๋ ์ ์ผ๋ก ์ ๋ฆฌ๋ฅผ ํ๋ฉด์ ํญ์ ๋ณต์ต์ ํ๋ฉฐ this์ ๋ํด ์ ํํ ์์๊ฐ๋๋ก ํ์.
์ฐธ๊ณ ์๋ฃ
์ด์ ๋ชจ, ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive, ์ํค๋ถ์ค
https://joontae-kim.github.io/2020/11/02/js-oop-2/
https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D