๐ Chapter 8 : ํด๋์ค๋ก ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๋ผ.
๐ฏ ์ฝ๊ธฐ ์ฌ์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ผ.โ
- ํด๋์ค๋ฅผ ์ ์ธํ ๋
class
ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋new
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
class Coupon {
}
const coupon = new Coupon();
- ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ ๊ฐ์ฅ ๋จผ์ ์์ฑ์ ํจ์๋ฅผ ์คํํ๋ค.
- ๊ทธ๋ค์์ ์์ฑ์ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์
constructor()
๋ผ๊ณ ์ด๋ฆ์ ๋ถ์ธ๋ค. constructor()
๋ฅผ ํด๋์ค์ ์ถ๊ฐํ ๋๋ ํจ์๋ฅผ ์์ฑํ๋ ๋ฌธ๋ฒ๊ณผ ๋น์ท ํ์ง๋งfunction()
ํค์๋ ์์ด ์์ฑํด์ผ ํ๋ค.- ์์ฑ์๋ ํจ์์ด๋ฏ๋ก ์์ ๋กญ๊ฒ ์ธ์๋ฅผ ์ ๋ฌํ ์๋ ์๋ค.
- ์์ฑ์์ ์ญํ ์ค ํ๋๋
this
๋ฌธ๋งฅ์ ์์ฑํ๋ ๊ฒ์ด๋ค. - ์์ฑ์ ๋ด๋ถ์์ ๊ฐ์ฒด์ ํค-๊ฐ ์์ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ
this
์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๋์ค์ ์์ฑ์ ์ถ๊ฐํ ์ ์๋ค. - ๋ํ, ์์ฑ์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ์์ฑ์ ๋์ ์ผ๋ก ์ค์ ํ ์๋ ์๋ค.
- ๋ ๊ฐ์ ์์ฑ
price
์expiration
์ ์ค์ .
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
}
const coupon = new Coupon(5);
coupon.price; // 5
coupon['expiration']; // "2์ฃผ"
- ๋ ๊ฐ์ง ๊ฐ๋จํ ๋ฉ์๋๋ฅผ ์ถ๊ฐ.
- ์์ฑ์์ ๋์ผํ ๋ฌธ๋ฒ์ผ๋ก ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ๋ฉ์๋๋ ํ์ดํ ํจ์๊ฐ ์๋ ๋ณดํต ํจ์๋ก ์์ฑํ๋ค.
- ํด๋์ค ๋ฉ์๋๋ฅผ ํด๋์ค์ ์ธ์คํด์ค์์ ํธ์ถํ๋ค๋ฉด
this
๋ฌธ๋งฅ์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
getPriceText() {
return `$ ${this.price}`;
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
}
const coupon = new Coupon(5);
coupon.getPriceText(); // "$ 5"
coupon.getExpirationMessage(); // "์ด ์ฟ ํฐ์ 2์ฃผ ํ์ ๋ง๋ฃ๋ฉ๋๋ค."
๐ฏ ์์์ผ๋ก ๋ฉ์๋๋ฅผ ๊ณต์ ํ๋ผ.โ
- ์๋์ ์ฝ๋์ ๊ฐ์ด ์์์ ์ฌ์ฉํ
Coupon
ํด๋์ค๋ฅผextends
๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฐ์ ์ ์๋ค.
import Coupon from './extend';
class FlashCoupon extends Coupon {
}
const flash = new FlashCoupon(10);
flash.price; // 10
flash.getPriceText(); // "$ 10"
- ์๋ก์ด ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๊ฒ์ด ์๋๋ผ๋ฉด ์์์๋ ์๋ฌด๋ฐ ์๋ฏธ๋ ์๋ค.
- ์๋ก์ด ์์ฑ์์์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์์ ์ ๊ทผํ๋ ค๋ฉด
super()
๋ฅผ ํธ์ถํด์ผ ํ๋ค. super()
๋ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์์ ํ์ํ ์ธ์๊ฐ ์๋ค๋ฉดsuper()
๋ฅผ ์ด์ฉํด์ ๋๊ฒจ์ค ์ ์๋ค.- ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ถ๋ชจ ์์ฑ์๊ฐ ์ค์ ํ ์์ฑ์ ๋ฎ์ด์ธ ์ ์๋ค.
import Coupon from './extend';
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์๊ฐ';
}
}
const flash = new FlashCoupon(10);
flash.price; // 10
flash.getExpirationMessage(); // "์ด ์ฟ ํฐ์ 2์๊ฐ ํ์ ๋ง๋ฃ๋ฉ๋๋ค."
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จผ์ ํ์ฌ ํด๋์ค์ ๋ฉ์๋๊ฐ ์๋์ง ํ์ธํ ๋ค ๋ง์ฝ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ์์ ์ฐ๊ฒฐ์ ์์๋ก ์ฌ๋ผ๊ฐ์ ๊ฐ ํด๋์ค๋ ํ๋กํ ํ์ ์ ํ์ธํ๋ค.
- ์ฆ, ํด๋์ค์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์๋ก ์์ฑํ๋ฉด ๋ถ๋ชจ ํด๋์ค์์ ์์ํ ๋ฉ์๋๋ฅผ ๋์ฒดํ๋ค.
- ์๋ก์ด ๋ฉ์๋๋ ์ถ๊ฐํ ์ ์๋ค.
- ๋ค์ ์์ ๋ ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ ๊ฒ์ด๋ค.
- ์ฃผ์ํ ์ ์ ๋ถ๋ชจ ํด๋์ค์ ์ถ๊ฐํ๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค๊ฐ ์์๋ฐ๋๋ค๋ ๊ฒ์ด๋ค.
- ์์ ํด๋์ค์์ ํ์ํ์ง ์์ ๋ฉ์๋๋ฅผ ๋ถ๋ชจ ํด๋์ค์ ์ถ๊ฐํ๋ฉด ์์ ํด๋์ค๊ฐ ๋น๋ํด์ง๊ธฐ ์ฝ๋ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
getPriceText() {
return `$ ${this.price}`;
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
// ์ถ๊ฐ
isRewardsEligible(user) {
// ์ต๊ทผ์ ์ ์ํ ์ฌ์ฉ์์ด๋ฉฐ, ๋ณด์๋ฐ์ ์๊ฒฉ์ด ์๋ ๊ฒฝ์ฐ
return user.rewardsEligible && user.active;
}
getRewards(user) {
if(this.isRewardsEligible(user)) {
this.price = this.price * 0.9;
}
}
}
export default Coupon;
- ์์ ํด๋์ค
import Coupon from './extend';
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์๊ฐ';
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์ ๊น์ง ์ฟ ํฐ์ด๋ฉฐ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
isRewardsEligible(user) {
// ์ต๊ทผ์ ์ ์ํ ์ฌ์ฉ์์ด๋ฉฐ, ๋ณด์๋ฐ์ ์๊ฒฉ์ด ์๋ ๊ฒฝ์ฐ์ ์ํ์ ๊ฐ๊ฒฉ์ด 20๋ฌ๋ฌ ์ด์
return super.isRewardsEligible(user) && this.price > 20;
}
getRewards(user) {
if(this.isRewardsEligible(user)) {
this.price = this.price * 0.8;
}
}
}
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฃจ๋น, ์๋ฐ ๋ฑ๊ณผ ํด๋์ค๋ฅผ ์ฐ๋ ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค.