๐ 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;
}
}
}
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฃจ๋น, ์๋ฐ ๋ฑ๊ณผ ํด๋์ค๋ฅผ ์ฐ๋ ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด์ด๋ค.
๐ฏ ํด๋์ค๋ก ๊ธฐ์กด์ ํ๋กํ ํ์ ์ ํ์ฅํ๋ผ.โ
- ์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋์ค์ ํ๋กํ ํ์ ์ด ๋ค๋ฅด์ง ์๋ค๋ ์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ํด๋์ค๋ ๋จ์ง ๋ณดํต์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด๋ค.
- ์ ํต์ ์ธ ๊ฐ์ฒด ์งํฅ ์ธ์ด์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฉด ์๋ก์ด ๊ฐ์ฒด์ ๋ชจ๋ ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ๋ณต์ ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋กํ ํ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ฉ์๋๋ฅผ ๋ณต์ ํ์ง ์๋๋ค. ๊ทธ ๋์ ํ๋กํ ํ์ ์ ๋ํ ์ฐ๊ฒฐ์ ์์ฑํ๋ค.
- ๊ฐ์ฒด์ ์ธ์คํด์ค์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํ๋กํ ํ์ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.(์ฐธ๊ณ )
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์
class
๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋๋ผ ํด๋์ค๋ ๋จ์ง ํ๋กํ ํ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ์๊ธฐ๋ฒ์ผ ๋ฟ์ธ ๊ฒ์ด๋ค. - ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์ธ์คํด์ค ๋ง๋ค๊ธฐ ์ํด์๋ ๊ฐ๋จํ ํจ์๋ฅผ ์์ฑํ๋ฉด ๋๋๋ฐ ํจ์๋ก ์์ฑ์๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ฝ๋ฉ ์ปจ๋ฒค์ ์ผ๋ก ํจ์๋ช ์ ๋๋ฌธ์๋ก ์์ํ๋ค.
- ํจ์ ๋ด๋ถ์์
this
ํค์๋๋ฅผ ์ฌ์ฉํด ์์ฑ์ ์ฐ๊ฒฐํ ์ ์๋ค. new
ํค์๋๋ฅผ ์ด์ฉํด์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ ํจ์๋ฅผ ์์ฑ์๋ก ์ฌ์ฉํ๊ณthis
๋ฌธ๋งฅ์ ๋ฐ์ธ๋ฉํ๋ค.- ์๋ ์์ ์ฝ๋๋ ์์ฑ์ ํจ์๋ฅผ ์ด์ฉํด์ ํด๋์ค๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
function Coupon(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
const coupon = new Coupon(5, '2๊ฐ์');
coupon.price; // 5
new
ํค์๋๋ก ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ์์ฑ์๋ฅผ ์คํํ๊ณthis
๋ฌธ๋งฅ์ ๋ฐ์ธ๋ฉํ์ง๋ง ๋ฉ์๋๋ฅผ ๋ณต์ ํ์ง๋ ์๋๋ค.- ์์ฑ์์์
this
์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์๋ ์์ง๋ง, ํ๋กํ ํ์ ์ ์ง์ ์ถ๊ฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํจ์จ์ ์ด๋ค. - ํ๋กํ ํ์ ์ ์์ฑ์ ํจ์์ ๊ธฐ๋ฐ์ด ๋๋ ๊ฐ์ฒด์ด๋ค.
- ๋ชจ๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ ํ๋กํ ํ์ ์์ ์์ฑ์ ๊ฐ์ ธ์ค๊ณ , ์๋ก์ด ์ธ์คํด์ค๋ ํ๋กํ ํ์ ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Coupon.prototype.getExpirationMessage = function() {
return `์ด ์ฟ ํฐ์ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
};
coupon.getExpirationMessage(); // "์ด ์ฟ ํฐ์ 2๊ฐ์ ํ์ ๋ง๋ฃ๋ฉ๋๋ค."
class
ํค์๋๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ์ฌ์ ํ ํ๋กํ ํ์ ์ ์์ฑํ๊ณ ๋ฌธ๋งฅ(context)์ ๋ฐ์ธ๋ฉํ๋ค.- ๋จ์ง
class
ํค์๋๋ฅผ ์ด์ฉํ๋ฉด ๋์ฑ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ฟ์ด๋ค. - ์์ฑ์ ํจ์์ ํ๋กํ ํ์ ์ ์ฌ์ฉํด ์์ฑํ ์ฝ๋๋ class ํค์๋๋ก ์์ฑํ ๊ฒ๊ณผ ๋์ผํ๋ค.
- ๋ด๋ถ์ ์ผ๋ก๋ ๋จ์ง ํ๋กํ ํ์ ์ ์์ฑํ ๋ฟ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ ์ด์ฉํด์ ์์ฑํ ๋ ๊ฑฐ์ ์ฝ๋์ ์๋ก์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
class FlashCoupon extends Coupon {
constructor(price, expiration) {
super(price);
this.expiration = expiration || '2์๊ฐ';
}
getExpirationMessage() {
return `์ด ์ฟ ํฐ์ ๊น์ง ์ฟ ํฐ์ด๋ฉฐ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
}
๐ฏ get๊ณผ set์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค์ด๋ผ.โ
- ์ฐ๋ฆฌ๊ฐ ์์ฑํ ํด๋์ค์ ์์ฑ ์ค ๋ ธ์ถํ ์๊ฐ์ด ์์๋ ๊ฒ์ ๋๊ตฐ๊ฐ ์กฐ์ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ๊ฒ์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฃผ์ ๋ฌธ์ ์ ์ค ํ๋๋ ๋น๊ณต๊ฐ(static) ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์๋๋ค๋ ์ ์ด๋ค.
- ์๋์ ์์ ์ฝ๋์์ price๋ฅผ ์ ์๋ก ์ค์ ํ์ง ์๊ณ ๋ฌธ์์ด๋ก ์ค์ ํ๋ฉด ์์ํ์ง ๋ชปํ ๋ฒ๊ทธ๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
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.price = '$10';
coupon.getPriceText(); // "$ $10"
- ์ด๋ด ๊ฒฝ์ฐ ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์
getter
์setter
๋ฅผ ์ด์ฉํด์ ๋ก์ง์ ์ถ๊ฐํ๊ณ ์์ฑ์ ๋ค๋ก ์จ๊ธฐ๋ ๊ฒ์ด๋ค. - ์ ์์ ์ฝ๋์ ๋ฉ์๋๋ฅผ
getter
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
get priceText() {
return `$ ${this.price}`;
}
get expirationMessage() {
return `์ด ์ฟ ํฐ์ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
}
- ๊ฐ๋จํ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ ๋ค์๋ ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ์๋ ๊ดํธ๋ฅผ ์ฐ์ง ์๋๋ค.
- ์ค์ ๋ก๋ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ด์ง๋ง ๋ฉ์๋๊ฐ ๋ง์น ์์ฑ์ฒ๋ผ ์๋ํ๋ค.
const coupon = new Coupon(5);
coupon.price = 10;
coupon.priceText; // "$ 10"
coupon.expirationMessage; // "์ด ์ฟ ํฐ์ 2์ฃผ ํ์ ๋ง๋ฃ๋ฉ๋๋ค."
- ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ฌ์์ง์ง๋ง, ๋๊ตฐ๊ฐ๊ฐ ์๋ชป๋ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
- ์ด๋ฅผ ์ํด์๋
setter
๋ ์์ฑํด์ผ ํ๋ค. setter
๋ ๊ฒํฐ์ฒ๋ผ ๋์ํ์ง๋ง ์ธ์๋ฅผ ํ๋๋ง ๋ฐ๊ณ , ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ์์ฑ์ ๋ณ๊ฒฝํ๋ค.setter
์ ์ธ์๋ฅผ ์ ๋ฌํ ๋๋ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.- ๊ทธ ๋์ ๊ฐ์ฒด์ ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ฒ๋ผ ๋ฑํธ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ๋ฌํ๋ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
set halfPrice(price) {
this.price = price / 2;
}
}
setter
์ ๋์๋๋getter
๊ฐ ์์ผ๋ฉด ๊ฐ์ ์ค์ ํ ์๋ ์์ง๋ง, ๊ฐ์ ๊ฐ์ ธ์ฌ ์๋ ์๋ค.
const coupon = new Coupon(5);
coupon.halfPrice = 20;
coupon.halfPrice; // undefined
getter
๋setter
์ ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์ ๋ ์ ์๋ค.- ๋ค์๊ณผ ๊ฐ์ด
price
์์ฑ์ด ์์ ๋setter
๋ฅผ ๋ง๋ค๋ฉด ํธ์ถ ์คํ์ด ๋ฌดํํ ์์ด๊ฒ ๋๋ค.
class Coupon {
constructor(price, expiration) {
this.price = price;
this.expiration = expiration || '2์ฃผ';
}
get price() {
return this.price;
}
set price(price) {
this.price = `$ ${price}`;
}
}
const coupon = new Coupon(5);
// Uncaught RangeError: Maximum call stack size exceeded
- ํด๊ฒฐ์ฑ
์ ๋ค๋ฅธ ์์ฑ์
getter
์setter
์ฌ์ด์ ๊ฐ๊ต๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. - ํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋น๊ณต๊ฐ ์์ฑ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ฐ๋ฅผ ์๋ฐ์ ์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์ ์ด๋ฆ ์์ ๋ฐ์ค์ ์
๋ ฅํด ๋ฉ์๋๋ ์์ฑ์ด ๋น๊ณต๊ฐ๋ผ๋ ์ ์ ํ์ํ๋ค. (์:
_price
) - ์ด์ ์ ์๋ง ๋จ๊ธฐ๊ณ ์ซ์๊ฐ ์๋ ๋ฌธ์๋ ๋ชจ๋ ์ ๊ฑฐํ ์ ์๋
setter
๋ฅผ ์์ฑํ ์ ์๋ค.
class Coupon {
constructor(price, expiration) {
this._price = price;
this.expiration = expiration || '2์ฃผ';
}
get priceText() {
return `$${this._price}`;
}
get price() {
return this._price;
}
set price(price) {
const newPrice = price.toString().replace(/[^\d]/g, '');
this._price = parseInt(newPrice, 10);
}
get expirationMessage() {
return `์ด ์ฟ ํฐ์ ${this.expiration} ํ์ ๋ง๋ฃ๋ฉ๋๋ค.`;
}
}
const coupon = new Coupon(5);
coupon.price; // 5
coupon.price = '$10';
coupon.price; // 10
coupon.priceText; // $10
getter
์setter
๊ฐ ๊ฐ์ ธ๋ค์ฃผ๋ ํฐ ์ด์ ์ ๋ณต์ก๋๋ฅผ ์จ๊ธธ ์ ์๋ค๋ ์ ์ด๋ค.- ๋จ์ ์ ์ด์ ํจ๊ป ์ฐ๋ฆฌ์ ์๋๊น์ง ๊ฐ๋ ค์ง๋ค๋ ์ ์ด๋ค.
getter
์setter
๋ ๋๋๋ก ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ณ ํ ์คํธํ๊ธฐ๋ ์ด๋ ต๋ค.- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ ์ฌ์ฉํ๊ณ ์ถฉ๋ถํ ํ ์คํธ์ ๋ฌธ์ํ๋ฅผ ํตํด ์๋๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํด์ผ ํ๋ค.
๐ฏ ์ ๋๋ ์ดํฐ๋ก ์ดํฐ๋ฌ๋ธ ์์ฑ์ ์์ฑํ๋ผ.โ
- ์ ๋๋ ์ดํฐ(Generator)๋ผ๋ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ๋ฐํํ ์ ์๋ค.
- ์ด๋ฅผ ํตํด ๊น๊ฒ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ๋จ์ํ ๊ตฌ์กฐ๋ก ๋ณํํ ์ ์๋ค.
- ์ ๋๋ ์ดํฐ๋ ํด๋์ค์๋ง ๊ตญํ๋์ง ์๊ณ ํนํ๋ ํจ์์ด๋ค.
- ์ ๋๋ ์ดํฐ๋ (MDN ์ฐธ๊ณ ) ํจ์๊ฐ ํธ์ถ๋์์ ๋ ๊ทธ ์ฆ์ ๋๊น์ง ์คํํ์ง ์๊ณ ์ค๊ฐ์ ๋น ์ ธ๋๊ฐ๋ค๊ฐ ๋ค์ ๋์์ฌ ์ ์๋ ํจ์์ด๋ค.
- ์ ๋๋ ์ดํฐ๋ ํจ์ ๋ชธ์ฒด์ ์คํ์ ์ฆ์ ๋๋ด์ง ์๋ ํ๋์ ํจ์์ด๋ค.
- ์ฆ, ์ ๋ ๋ ์ดํฐ๋ ๋ค์ ๋จ๊ณ ์ ๊น์ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ ์ ์งํ๋ ์ค๋จ์ ์ด ์๋ ํจ์์ด๋ค.
- ์ ๋๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ค๋ฉด
function
ํค์๋ ๋ค์ ๋ณํ(*
)๋ฅผ ์ถ๊ฐํ๋ค. - ์ด๋ ๊ฒ ํ๋ฉด ํจ์์ ์ผ๋ถ๋ฅผ ๋ฐํํ๋
next()
๋ผ๋ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ค. - ํจ์ ๋ชธ์ฒด ์์์๋
yield
ํค์๋๋ฅผ ์ด์ฉํด ์ ๋ณด๋ฅผ ๋ฐํํ๋ค. - ํจ์๋ฅผ ์คํํ ๋๋
next()
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํจ์๊ฐ ๋ด๋ณด๋ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. next()
๋ฅผ ํธ์ถํ๋ฉด ๋ ๊ฐ์ ํคvalue
์done
์ด ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.- ์ฌ๊ธฐ์
yield
๋ก ์ ์ธํ ํญ๋ชฉ์ดvalue
์ด๊ณ ,done
์ ๋จ์ ํญ๋ชฉ์ด ์๋ค๋ ๊ฒ์ ์๋ ค์ค๋ค.
function* getCairoTrilogy() {
yield '๊ถ์ ์๊ธธ';
yield '์๋ง์ ๊ถ์ ';
yield '์คํ ๊ฑฐ๋ฆฌ';
}
const trilogy = getCairoTrilogy();
trilogy.next(); // {value: "๊ถ์ ์๊ธธ", done: false}
trilogy.next(); // {value: "์๋ง์ ๊ถ์ ", done: false}
trilogy.next(); // {value: "์คํ ๊ฑฐ๋ฆฌ", done: false}
trilogy.next(); // {value: undefined, done: true}
- ํจ์๋ฅผ ๋จ๊ณ๋ณ๋ก ์กฐ๊ฐ์กฐ๊ฐ ์คํํ ์ ์๋ค.
- ์ ๋ณด์ ์ผ๋ถ๋ง ๊บผ๋ด๊ณ ๋ค์ ์กฐ๊ฐ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ๊ธฐ ์ํด ์ ๋๋ ์ดํฐ๋ฅผ ์ ๋ฌํด ์ค ์๋ ์๋ค. ๋ํ, ๊ณ ์ฐจ ํจ์์ ๊ฒฝ์ฐ์ฒ๋ผ ๋ค๋ฅธ ๊ณณ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ ๋ํ ์ด๋ฌ๊ฐ ํจ์๋ฅผ ์ดํฐ๋ฌ๋ธ๋ก ๋ฐ๊ฟ์ค ์ ์๊ฒ ๋์๋ค.
- ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์ดํฐ๋ฌ๋ธ์ ๋ง๋ค ์ ์๋ค.
- ์ ๋๋ ์ดํฐ๋ฅผ ์ดํฐ๋ฌ๋ธ๋ก ์ฌ์ฉํ ๋ ๋ฐ๋์
next()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋ค. - ์ดํฐ๋ฌ๋ธ์ด ํ์ํ ์์ ์ ๋ฌด์์ด๋ ๊ฐ๋ฅํ๋ค.
- ์๋ ์ฝ๋์ฒ๋ผ ๋ฐฐ์ด์ ๋ด์ผ๋ ค๋ฉด ๊ฐ๋จํ๊ฒ ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
[...getCairoTrilogy()];
// ["๊ถ์ ์๊ธธ", "์๋ง์ ๊ถ์ ", "์คํ ๊ฑฐ๋ฆฌ"]
- ์๋ ์์ ์ฒ๋ผ
for...of
๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.
const readingList = {
'๊นกํจ๋จ์ ๋ฐฉ๋ฌธ': true,
'๋งจํดํผ ๋น์น': false,
};
for(const book of getCairoTrilogy()) {
readingList[book] = false;
}
readingList;
// {
// ๊ถ์ ์๊ธธ: false,
// ๊นกํจ๋จ์ ๋ฐฉ๋ฌธ: true,
// ๋งจํดํผ ๋น์น: false,
// ์คํ ๊ฑฐ๋ฆฌ: false,
// ์๋ง์ ๊ถ์ : false,
// }
- ์ ๋๋ ์ดํฐ๋ ํด๋์ค์์๋ ์ฌ์ฉ๋๋ค.
- ์ ๋๋ ์ดํฐ๋
getter
์setter
์ฒ๋ผ ํด๋์ค์ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์๋ค. - ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๋ ํด๋์ค๋ฅผ ๋ง๋ค ๋, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋จ์ํ ๋ฐฐ์ด์ ๋ค๋ฃจ๋ ๊ฒ์ฒ๋ผ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ฒ ์ค๊ณํ ์ ์๋ค.
- ์๋๋ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ๋น ๋ฐฐ์ด์ ์์ฑํ๊ณ
family
๋ฅผ ๋ด์ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
class FamilyTree {
constructor() {
this.family = {
name: 'Seung',
child: {
name: 'Harang',
child: {
name: 'Sa',
child: {
name: 'In',
},
},
},
};
}
getMembers() {
const family = [];
let node = this.family;
while(node) {
family.push(node.name);
node = node.child;
}
return family;
}
}
const family = new FamilyTree();
family.getMembers();
// ["Seung", "Harang", "Sa", "In"]
- ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ๋ด์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ฐํํ ์ ์๋ค.
- ๊ฒ๋ค๊ฐ ์ฌ์ฉ์๊ฐ ๋ฉ์๋ ์ด๋ฆ์ ์ฐพ์๋ณผ ํ์๋ ์์ผ๋ฉฐ, ๊ฐ๊ณ๋๋ฅผ ๋ด๊ณ ์๋ ์์ฑ์ ๋ง์น ๋ฐฐ์ด์ธ ๊ฒ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ค.
- ๋จผ์ ๋ฉ์๋ ์ด๋ฆ์
getMembers()
๋์*
[Symbol.iterator]()
๋ก ๋ฐ๊พผ๋ค. *
๋ ์ ๋๋ ์ดํฐ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ํ์ํ๊ณ ,Symbol.iterator
๋ ํด๋์ค์ ์ดํฐ๋ฌ๋ธ์ ์ ๋๋ ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ค. (๋งต ๊ฐ์ฒด๊ฐ ๋งต ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๋น์ท)- ์์ ์ดํด๋ณธ
getCairoTrilogy()
์ ๋๋ ์ดํฐ์ ๋ค๋ฅธ ์ ์ ํน์ ํ ๊ฐ์ ๋ช ์์ ์ผ๋ก ๋ฐํํ์ง ์๋ ๋ถ๋ถ์ด๋ค. ๋์ ์ ๋ฐ๋ณต๋ฌธ์ ๋งคํ๋ง๋คyield
๋ก ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ ๋ฐํํ ๊ฒ์ด ๋จ์์๋ ํ ์ ๋๋ ์ดํฐ๊ฐ ๊ณ์ ์งํ๋๋ค. family.push(node.name);
์ ์คํํ๋ ๋์ ์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๊ฒฐ๊ด๊ฐ์yield node.name
์ผ๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ๋ฟ์ด๋ค.- ์ฆ, ์ค๊ฐ ๋จ๊ณ์ ๋ฐฐ์ด์ ์ฌ์ฉํ ํ์๊ฐ ์์ด์ก๋ค.
- ์๋ ์ฝ๋์ฒ๋ผ ํผ์นจ ์ฐ์ฐ์๋
for...of
๋ฌธ์ฒ๋ผ ์ดํฐ๋ฌ๋ธ์ด ํ์ํ ์์ ์ด ์๋ค๋ฉด ํด๋์ค ์ธ์คํด์ค์ ๋ฐ๋ก ํธ์ถํด ์ฌ์ฉํ ์ ์๋ค.
class FamilyTree {
constructor() {
this.family = {
name: 'Seung',
child: {
name: 'Harang',
child: {
name: 'Sa',
child: {
name: 'In',
},
},
},
};
}
* [Symbol.iterator]() {
let node = this.family;
while(node) {
yield node.name;
node = node.child;
}
}
}
const family = new FamilyTree();
[...family];
// ["Seung", "Harang", "Sa", "In"]
- ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋์ ์ด์ ์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ํด๋์ค์ ์ธ๋ถ ๊ตฌํ ๋ด์ฉ์ ์ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
๐ฏ bind()๋ก ๋ฌธ๋งฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ผ.โ
- ๋ฌธ๋งฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํผ๋์ ์ผ์ผํฌ ์ ์๋๋ฐ,
this
ํค์๋๋ฅผ ์ฝ๋ฐฑ์ด๋ ๋ฐฐ์ด ๋ฉ์๋์์ ์ฌ์ฉํ ๋ ํนํ ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. - ์ด ๋ฌธ์ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง์ง ์๋๋ค. (์ฒซ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ: ํ์ดํ ํจ์๋ก ๋ฌธ๋งฅ ํผ๋์ ํผํ๋ผ)
- ์ฌ๊ธฐ์ ์ดํด๋ณผ ๊ธฐ๋ฒ๋ค์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ํด๋์ค์ ์ฌ์ฉํ ์ ์์ง๋ง ํด๋์ค ๋ฌธ๋ฒ๊ณผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ๋ ์ผ๋ฐ์ ์ด๋ค.
- ๋ค์์ ์์ ๋ฅผ ์ดํด๋ณด์.
class Validator {
constructor() {
this.message = '๊ฐ ์ ํจํ์ง ์์ต๋๋ค.';
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}
setInvalidMessages()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํจ์๋ ํด๋์ค์ ๋ํthis
๋ฐ์ธ๋ฉ์ ์์ฑํ๋ค.setInvalidMessages()
๋ฉ์๋๋ฅผ ์ดํด๋ณด๋ฉด, ๋ฐฐ์ด์map()
์ ํธ์ถํ๋ฉด์ ์ฝ๋ฐฑ์setInvalidMessage()
๋ฉ์๋๋ฅผ ์ ๋ฌํ๋ค.- ๊ทธ๋ฆฌ๊ณ
map()
๋ฉ์๋๊ฐsetInvalidMessage()
๋ฅผ ์คํํ๋ฉด, ์ด๋this
๋ ํด๋์ค๊ฐ ์๋๋ผ ๋ฐฐ์ด ๋ฉ์๋์ ๋ฌธ๋งฅ(context)์ผ๋ก ์๋ก์ด ์ฐ๊ฒฐ์ ์์ฑํ๋ค.
const validator = new Validator();
validator.setInvalidMessages('๋์');
// Uncaught TypeError: Cannot read property 'message' of undefined
- ๋ฌธ๋งฅ ๋ฌธ์ ๋ ๋ฆฌ์กํธ ์ปค๋ฎค๋ํฐ์์๋ ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ฐ ๋ฆฌ์กํธ์์ ๋ฐ์ํ๋ ๋ฌธ๋งฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๋ก ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ ์ฐธ๊ณ
- ์ฒซ ๋ฒ์งธ ํด๊ฒฐ์ฑ
์ ํ์ดํ ํจ์๋ก ๋ฌธ๋งฅ ํผ๋์ ํผํ๋ผ์์ ์ ์ํ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๋ค. ๋ฉ์๋๋ฅผ ํ์ดํ ํจ์๋ก ๋ฐ๊พธ๋ฉด ํ์ดํ ํจ์๋ ์๋ก์ด
this
์ฐ๊ฒฐ์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. - ์ด ๋ฐฉ๋ฒ์ ์ ์ผํ ๋จ์ ์ ํด๋์ค ๋ฌธ๋ฒ์ ์ฌ์ฉํ ๋ ํจ์๋ฅผ ๋ฉ์๋๊ฐ ์๋๋ผ ์์ฑ์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋ค๋ ๊ฒ์ด ๋ค.
class Validator {
constructor() {
this.message = '๊ฐ ์ ํจํ์ง ์์ต๋๋ค.';
this.setInvalidMessage = field => `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}
const validator = new Validator();
validator.setInvalidMessages('๋์');
// ["๋์๊ฐ ์ ํจํ์ง ์์ต๋๋ค."]
- ๋ฉ์๋๋ฅผ ์์ฑ์์ ์์ฑ์ผ๋ก ์ฎ๊ธฐ๋ฉด ๋ฌธ๋งฅ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์์ง๋ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ ๋ฉ์๋๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ์ ์๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ํ, ์ด๋ฐ ์์ผ๋ก ๋ฉ์๋๋ฅผ ๋ง์ด ์์ฑํ๋ค ๋ณด๋ฉด ์์ฑ์๊ฐ ๋น ๋ฅด๊ฒ ๋น๋ํด์ง๋ค.
- ๋ ๋์ ํด๊ฒฐ์ฑ
์
bind()
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค. - ๋ชจ๋ ํจ์์ ์ฌ์ฉํ ์ ์๋
bind()
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฌธ๋งฅ์ ๋ช ์์ ์ผ๋ก ์ ํ ์ ์๋ค. - ํจ์์์
this
๋ก ์ฐ๊ฒฐํ ๊ณณ์ ๋ช ์์ ์ผ๋ก ์ ํ๊ธฐ ๋๋ฌธ์this
๋ก ์ฐธ์กฐ๋ ๊ณณ์ ํญ์ ์ ์ ์๋ค.
function sayMessage() {
return this.message;
}
const alert = {
message: '์ํํด!',
};
const sayAlert = sayMessage.bind(alert);
sayAlert();
// "์ํํด!"
- ํจ์๊ฐ
this
๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ์ฐ๋ฆฌ๊ฐ ์ฐ๊ฒฐํ ๊ฐ์ฒด๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ด๋ค. - ์ด๋ฐ ๊ฒ์ ๋ช ์์ ์ฐ๊ฒฐ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ๋ฌธ๋งฅ์ด ๋ฐํ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์ค์ ๋์ง ์๋๋ก ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ฌธ๋งฅ์ ์ ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค. (์ฐธ๊ณ )
- ์ด์ ํจ์๋ฅผ
this
์ ์ฐ๊ฒฐํด์ ๊ธฐ์กด์ ๋ฌธ๋งฅ์ ์ฐ๊ฒฐํ ์๋ ์๋ค.
class Validator {
constructor() {
this.message = '๊ฐ ์ ํจํ์ง ์์ต๋๋ค.';
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage.bind(this));
}
}
const validator = new Validator();
validator.setInvalidMessages('๋์');
// ["๋์๊ฐ ์ ํจํ์ง ์์ต๋๋ค."]
- ์ด ๋ฐฉ๋ฒ์ ์ ์ผํ ๋จ์ ์ ๋ค๋ฅธ ๋ฉ์๋์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด
bind()
๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. - ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ด ๋ฐฉ๋ฒ์ ์ฅ์ ์ ๋ฉ์๋๋ฅผ ์๋์ ์์น์ ๊ทธ๋๋ก ์ ์งํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋จ์ง ์์ฑ์์์
this
์ ์ฐ๊ฒฐํ ๋ฟ์ด๋ค. - ์ด์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ํด๋์ค์ ๋ชธ์ฒด ํ ๊ณณ์ ์ ์ธํ ์ ์๊ฒ ๋์๊ณ , ์์ฑ์ ์์ฑ์์์ ์ ์ธํ๊ณ , ๋ฌธ๋งฅ๋ ์์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฑ์์์๋ง ์ค์ ํ๋ค.
class Validator {
constructor() {
this.message = '๊ฐ ์ ํจํ์ง ์์ต๋๋ค.';
this.setInvalidMessage = this.setInvalidMessage.bind(this);
}
setInvalidMessage(field) {
return `${field}${this.message}`;
}
setInvalidMessages(...fields) {
return fields.map(this.setInvalidMessage);
}
}
const validator = new Validator();
validator.setInvalidMessages('๋์');
// ["๋์๊ฐ ์ ํจํ์ง ์์ต๋๋ค."]
- ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋ฐฉ์๊ณผ ํจ์๋ฅผ
this
์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์ ๋ชจ๋ ํ์ฌ์ ๋ช ์ธ์์ ์ ์๋ํ๋ค. - ์ถํ์๋ ์์ฑ์ ๋ฐ์์ ํด๋์ค ์์ฑ์ ์ค์ ํ ์ ์๋ ๋ช ์ธ๊ฐ ๋์ ๋ ๊ฒ์ด๋ค.
- ์๋ก์ด ๋ช ์ธ๋ฅผ ์ ์ฉํ๋ฉด ๋ค๋ฅธ ๋ฉ์๋ ์์ ํ์ดํ ํจ์๋ฅผ ์์ฑ์ผ๋ก ํ ๋นํ ์ ์๊ฒ ๋๋ค.
class Validator {
message = '๊ฐ ์ ํจํ์ง ์์ต๋๋ค.';
setMessage = field => `${field}${this.message}`;
setInvalidMessages(...fields) {
return fields.map(this.setMessage);
}
}
const validator = new Validator();
validator.setInvalidMessages('๋์');
// ["๋์๊ฐ ์ ํจํ์ง ์์ต๋๋ค."]
- ๋ฐ๋ฒจ์ 7.0๋ถํฐ ํด๋์ค ์์ฑ์ ์ง์ํ๋ค. ๊ณต๊ฐ ํด๋์ค ์์ฑ์ ํฌ๋กฌ 72, ๋น๊ณต๊ฐ ํด๋์ค ์์ฑ์ ํฌ๋กฌ 74๋ถํฐ ์ง์ํ๊ณ , Mode.js๋ ๋ฒ์ 12๋ถํฐ ํด๋์ค ์์ฑ์ ์ง์ํ๋ฏ๋ก ํด๋น ๋ฒ์ ๋ถํฐ๋ REPL์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ๋ฌธ๋งฅ ์ฐ๊ฒฐ์ ๋น์ฉ์ด ํด ์ ์์ผ๋ฏ๋ก ํน์ ํ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.