ê°ì²´ 리í°ë´ {...} ì ì¬ì©íë©´ ê°ì²´ë¥¼ ì½ê² ë§ë¤ ì ììµëë¤. ê·¸ë°ë° ê°ë°ì íë¤ ë³´ë©´ ì ì¬í ê°ì²´ë¥¼ ì¬ë¬ ê° ë§ë¤ì´ì¼ í ëê° ì기곤 í©ëë¤. ë³µìì ì¬ì©ì, ë©ë´ ë´ ë¤ìí ìì´í
ì ê°ì²´ë¡ íííë ¤ê³ íë ê²½ì°ê° ê·¸ë ì£ .
'new' ì°ì°ìì ìì±ì í¨ì를 ì¬ì©íë©´ ì ì¬í ê°ì²´ ì¬ë¬ ê°ë¥¼ ì½ê² ë§ë¤ ì ììµëë¤.
ìì±ì í¨ì
ìì±ì í¨ì(constructor function)ì ì¼ë° í¨ìì 기ì ì ì¸ ì°¨ì´ë ììµëë¤. ë¤ë§ ìì±ì í¨ìë ìë ë ê´ë¡ë¥¼ ë°ë¦ ëë¤.
- í¨ì ì´ë¦ì 첫 ê¸ìë ë문ìë¡ ììí©ëë¤.
- ë°ëì
'new'ì°ì°ì를 ë¶ì¬ ì¤íí©ëë¤.
ìì:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("ë³´ë¼");
alert(user.name); // ë³´ë¼
alert(user.isAdmin); // false
new User(...)를 ì¨ì í¨ì를 ì¤ííë©´ ìëì ê°ì ìê³ ë¦¬ì¦ì´ ëìí©ëë¤.
- ë¹ ê°ì²´ë¥¼ ë§ë¤ì´
thisì í ë¹í©ëë¤. - í¨ì 본문ì ì¤íí©ëë¤.
thisì ìë¡ì´ íë¡í¼í°ë¥¼ ì¶ê°í´this를 ìì í©ëë¤. this를 ë°íí©ëë¤.
ìì를 ì´ì©í´ new User(...)ê° ì¤íëë©´ ë¬´ì¨ ì¼ì´ ì¼ì´ëëì§ ì´í´ ë³´ëë¡ íê² ìµëë¤.
function User(name) {
// this = {}; (ë¹ ê°ì²´ê° ììì ì¼ë¡ ë§ë¤ì´ì§)
// ìë¡ì´ íë¡í¼í°ë¥¼ thisì ì¶ê°í¨
this.name = name;
this.isAdmin = false;
// return this; (thisê° ììì ì¼ë¡ ë°íë¨)
}
ì´ì let user = new User("ë³´ë¼")ë ìë ì½ë를 ì
ë ¥í ê²ê³¼ ëì¼íê² ëìí©ëë¤.
let user = {
name: "ë³´ë¼",
isAdmin: false
};
new User("ë³´ë¼")ì´ì¸ìë new User("í¸ì§"), new User("ì§ë¯¼") ë±ì ì´ì©íë©´ ìì½ê² ì¬ì©ì ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤. ê°ì²´ 리í°ë´ 문ë²ì¼ë¡ ì¼ì¼ì´ ê°ì²´ë¥¼ ë§ëë ë°©ë²ë³´ë¤ í¨ì¬ ê°ë¨íê³ ì½ê¸° ì½ê² ê°ì²´ë¥¼ ë§ë¤ ì ìê² ëìì£ .
ìì±ìì ììë ë°ë¡ ì¬ê¸°ì ììµëë¤. ì¬ì¬ì©í ì ìë ê°ì²´ ìì± ì½ë를 구ííë ê²ì´ì£ .
ì ê¹! 모ë í¨ìë ìì±ì í¨ìê° ë ì ìë¤ë ì ì ìì§ ë§ì기 ë°ëëë¤. new를 ë¶ì¬ ì¤ííë¤ë©´ ì´ë¤ í¨ìë¼ë ìì ì¸ê¸ë ìê³ ë¦¬ì¦ì´ ì¤íë©ëë¤. ì´ë¦ì '첫 ê¸ìê° ë문ìâì¸ í¨ìë new를 ë¶ì¬ ì¤íí´ì¼ íë¤ë ì ë ìì§ ë§ì¸ì. ê³µëì ì½ìì´ëê¹ì.
ì¬ì¬ì©í íìê° ìë ë³µì¡í ê°ì²´ë¥¼ ë§ë¤ì´ì¼ íë¤ê³ í´ë´ ìë¤. ë§ì ìì ì½ëê° íìí ê²ëë¤. ì´ë´ ë ìëì ê°ì´ ì½ë를 ìµëª ìì±ì í¨ìë¡ ê°ì¸ì£¼ë ë°©ìì ì¬ì©í ì ììµëë¤.
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ì¬ì©ì ê°ì²´ë¥¼ ë§ë¤ê¸° ìí ì¬ë¬ ì½ë.
// ì§ì ë³ì, ë³µì¡í ë¡ì§, 구문 ë±ì
// ë¤ìí ì½ëê° ì¬ê¸°ì ë¤ì´ê°ëë¤.
};
ì ìì±ì í¨ìë ìµëª í¨ìì´ê¸° ë문ì ì´ëìë ì ì¥ëì§ ììµëë¤. ì²ì ë§ë¤ ëë¶í° ë¨ í ë²ë§ í¸ì¶í 목ì ì¼ë¡ ë§ë¤ì기 ë문ì ì¬ì¬ì©ì´ ë¶ê°ë¥í©ëë¤. ì´ë ê² ìµëª ìì±ì í¨ì를 ì´ì©íë©´ ì¬ì¬ì©ì ë§ì¼ë©´ì ì½ë를 캡ìí í ì ììµëë¤.
new.targetê³¼ ìì±ì í¨ì
ì´ ì ìì ìê°í 문ë²ì ì주 ì°ì´ì§ ììµëë¤. ìë°ì¤í¬ë¦½í¸ì 모ë 문ë²ì íìµíê³ ì¶ì§ ìë¤ë©´ ëì´ê°ì ë ì¢ìµëë¤.
new.target íë¡í¼í°ë¥¼ ì¬ì©íë©´ í¨ìê° newì í¨ê» í¸ì¶ëìëì§ ìëì§ë¥¼ ì ì ììµëë¤.
ì¼ë°ì ì¸ ë°©ë²ì¼ë¡ í¨ì를 í¸ì¶íë¤ë©´ new.targetì undefined를 ë°íí©ëë¤. ë°ë©´ newì í¨ê» í¸ì¶í ê²½ì°ì new.targetì í¨ì ì체를 ë°íí´ì¤ëë¤.
function User() {
alert(new.target);
}
// 'new' ìì´ í¸ì¶í¨
User(); // undefined
// 'new'를 ë¶ì¬ í¸ì¶í¨
new User(); // function User { ... }
í¨ì 본문ìì new.targetì ì¬ì©íë©´ í´ë¹ í¨ìê° newì í¨ê» í¸ì¶ëìëì§(in constructor mode) ìëì§(in regular mode)를 íì¸í ì ììµëë¤.
ì´ë¥¼ íì©í´ ì¼ë°ì ì¸ ë°©ë²ì¼ë¡ í¨ì를 í¸ì¶í´ë new를 ë¶ì¬ í¸ì¶í ê²ê³¼ ê°ì´ ëìíëë¡ ë§ë¤ì´ë³´ê² ìµëë¤.
function User(name) {
if (!new.target) { // new ìì´ í¸ì¶í´ë
return new User(name); // new를 ë¶ì¬ì¤ëë¤.
}
this.name = name;
}
let bora = User("ë³´ë¼"); // 'new User'를 ì´ ê²ì²ë¼ ë°ê¿ì¤ëë¤.
alert(bora.name); // ë³´ë¼
ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë¶ìíë¤ ë³´ë©´ ìì ê°ì ë°©ìì´ ì°ì¸ 걸 ë°ê²¬í ëê° ìì ê²ëë¤. ì´ë° ë°©ìì ì¬ì©íë©´ new를 ë¶ì¬ í¨ì를 í¸ì¶íë ìëë ì½ëê° ëì¼íê² ëìí기 ë문ì, ì¢ ë ì ì°íê² ì½ë를 ìì±í ì ììµëë¤.
ê·¸ë°ë° ì´ ë°©ë²ì ë¯¿ê³ ê°ì²´ë¥¼ ë§ëë ê²½ì°ìë new를 ìëµíë©´ ì½ëê° ì íí ë¬´ì¨ ì¼ì íëì§ ì기 ì´ë µìµëë¤. newê° ë¶ì´ìì¼ë©´ ìë¡ì´ ê°ì²´ë¥¼ ë§ë ë¤ë 걸 ë구ë ì ì ì기 ë문ì new를 ìëµí´ì ê°ì²´ë¥¼ ë§ëëê²ì ì ë§ íìí ê²½ì°ìë§ ì¬ì©íìê³ ë¨ë°íì§ ìì¼ì길 ë°ëëë¤.
ìì±ìì return문
ìì±ì í¨ìì ë³´íµ return ë¬¸ì´ ììµëë¤. ë°íí´ì¼ í ê²ë¤ì 모ë thisì ì ì¥ëê³ , thisë ìëì¼ë¡ ë°íë기 ë문ì ë°í문ì ëª
ìì ì¼ë¡ ì¨ ì¤ íìê° ììµëë¤.
ê·¸ë°ë° ë§ì½ return ë¬¸ì´ ìë¤ë©´ ì´ë¤ ì¼ì´ ë²ì´ì§ê¹ì? ìëì ê°ì ê°ë¨í ê·ì¹ì´ ì ì©ë©ëë¤.
- ê°ì²´ë¥¼
returníë¤ë©´thisëì ê°ì²´ê° ë°íë©ëë¤. - ììíì
returníë¤ë©´returnë¬¸ì´ ë¬´ìë©ëë¤.
return ë¤ì ê°ì²´ê° ì¤ë©´ ìì±ì í¨ìë í´ë¹ ê°ì²´ë¥¼ ë°íí´ì£¼ê³ , ì´ ì¸ì ê²½ì°ë thisê° ë°íëì£ .
ìë ìììì 첫 ë²ì§¸ ê·ì¹ì´ ì ì©ë¼ returnì this를 무ìíê³ ê°ì²´ë¥¼ ë°íí©ëë¤.
function BigUser() {
this.name = "ììì´";
return { name: "ê³ ë¦´ë¼" }; // <-- thisê° ìë ìë¡ì´ ê°ì²´ë¥¼ ë°íí¨
}
alert( new BigUser().name ); // ê³ ë¦´ë¼
ì무ê²ë returníì§ ìë ìì를 ì´í´ë´
ìë¤. ììíì ë°ííë ê²½ì°ì ë§ì°¬ê°ì§ë¡ ë ë²ì§¸ ê·ì¹ì´ ì ì©ë©ëë¤.
function SmallUser() {
this.name = "ììì´";
return; // <-- this를 ë°íí¨
}
alert( new SmallUser().name ); // ììì´
returnë¬¸ì´ ìë ìì±ì í¨ìë ê±°ì ììµëë¤. ì¬ê¸°ì íí 리ì¼ì ìì±ë를 ìí´ í¹ì´ ì¼ì´ì¤ë¥¼ ìê°í´ë³´ììµëë¤.
ì¸ìê° ìë ìì±ì í¨ìë ê´í¸ë¥¼ ìëµí´ í¸ì¶í ì ììµëë¤.
let user = new User; // <-- ê´í¸ê° ìì
// ìë ì½ëë ì ì½ëì ëê°ì´ ëìí©ëë¤.
let user = new User();
ëª ì¸ìì ê´í¸ë¥¼ ìëµí´ë ëë¤ê³ ì ìëì´ ìì§ë§, 'ì¢ì ì¤íì¼âì ìëëë¤.
ìì±ì ë´ ë©ìë
ìì±ì í¨ì를 ì¬ì©íë©´ 매ê°ë³ì를 ì´ì©í´ ê°ì²´ ë´ë¶ë¥¼ ìì ë¡ê² 구ì±í ì ììµëë¤. ìì²ë ì ì°ì±ì´ íë³´ëì£ .
ì§ê¸ê¹ì§ thisì íë¡í¼í°ë¥¼ ëí´ì£¼ë ììë§ ì´í´ë´¤ëë°, ë©ìë를 ëí´ì£¼ë ê²ë ê°ë¥í©ëë¤.
ìë ìììì new User(name)ë íë¡í¼í° nameê³¼ ë©ìë sayHi를 ê°ì§ ê°ì²´ë¥¼ ë§ë¤ì´ì¤ëë¤.
function User(name) {
this.name = name;
this.sayHi = function() {
alert( "ì ì´ë¦ì " + this.name + "ì
ëë¤." );
};
}
let bora = new User("ì´ë³´ë¼");
bora.sayHi(); // ì ì´ë¦ì ì´ë³´ë¼ì
ëë¤.
/*
bora = {
name: "ì´ë³´ë¼",
sayHi: function() { ... }
}
*/
class 문ë²ì ì¬ì©íë©´ ìì±ì í¨ì를 ì¬ì©íë ê²ê³¼ ë§ì°¬ê°ì§ë¡ ë³µì¡í ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤. classì ëí´ì ì¶í íìµíëë¡ íê² ìµëë¤.
ìì½
- ìì±ì í¨ì(ì§§ê² ì¤ì¬ì ìì±ì)ë ì¼ë° í¨ìì ëë¤. ë¤ë§, ì¼ë° í¨ìì 구ë¶í기 ìí´ í¨ì ì´ë¦ 첫 ê¸ì를 ë문ìë¡ ìëë¤.
- ìì±ì í¨ìë ë°ëì
newì°ì°ìì í¨ê» í¸ì¶í´ì¼ í©ëë¤.newì í¨ê» í¸ì¶íë©´ ë´ë¶ììthisê° ììì ì¼ë¡ ë§ë¤ì´ì§ê³ , ë§ì§ë§ìthisê° ë°íë©ëë¤.
ìì±ì í¨ìë ì ì¬í ê°ì²´ë¥¼ ì¬ë¬ ê° ë§ë¤ ë ì ì©í©ëë¤.
ìë°ì¤í¬ë¦½í¸ë ì¸ì´ ì°¨ììì ë¤ìí ìì±ì í¨ì를 ì ê³µí©ëë¤. ë ì§ë¥¼ ëíë´ë ë° ì°ì´ë Date, ì§í©(set)ì ëíë´ë ë° ì°ì´ë Set ë±ì ë´ì¥ ê°ì²´ë ì´ë° ìì±ì í¨ì를 ì´ì©í´ ë§ë¤ ì ììµëë¤. ìì¸í ë´ì©ì ë¤ì ì´í´ë³´ëë¡ íê² ìµëë¤.
ì´ë² ì±í°ìì ë¤ë£¬ ê²ì ê°ì²´ì ìì±ìì ëí 기본ì ë¶ê³¼í©ëë¤. ì´ì´ì§ë ì±í°ìì ë¤ë£° ìë£íê³¼ í¨ì를 ì´í´íë ë° ê¼ íìí ë´ì©ì´ì£ .
ê°ì²´ì ëí íìµì ìì§ ëëì§ ìììµëë¤. ìë£íê³¼ í¨ì를 íìµí ì´íì ë¤ì ê°ì²´ë¡ ëìì íë¡í íì ê³¼ íë¡í íì ìì, í´ëì¤ë±ì ë¤ë£¨ëë¡ íê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.