ê°ì²´ë ì¬ì©ì(user), 주문(order) ë±ê³¼ ê°ì´ ì¤ì ì¡´ì¬íë ê°ì²´(entity)를 íííê³ ì í ë ìì±ë©ëë¤.
let user = {
name: "John",
age: 30
};
ì¬ì©ìë íì¤ìì ì¥ë°êµ¬ëìì 물건 ì íí기, ë¡ê·¸ì¸í기, ë¡ê·¸ììí기 ë±ì íëì í©ëë¤. ì´ì ë§ì°¬ê°ì§ë¡ ì¬ì©ì를 ëíë´ë ê°ì²´ userë í¹ì í íëì í ì ììµëë¤.
ìë°ì¤í¬ë¦½í¸ìì ê°ì²´ì íë¡í¼í°ì í¨ì를 í ë¹í´ ê°ì²´ìê² íëí ì ìë ë¥ë ¥ì ë¶ì¬í´ì¤ëë¤.
ë©ìë ë§ë¤ê¸°
ê°ì²´ userìê² ì¸ì¬í ì ìë ë¥ë ¥ì ë¶ì¬í´ ì¤ìë¤.
let user = {
name: "John",
age: 30
};
user.sayHi = function() {
alert("ìë
íì¸ì!");
};
user.sayHi(); // ìë
íì¸ì!
í¨ì ííìì¼ë¡ í¨ì를 ë§ë¤ê³ , ê°ì²´ íë¡í¼í° user.sayHiì í¨ì를 í ë¹í´ 주ììµëë¤.
ì´ì ê°ì²´ì í ë¹ë í¨ì를 í¸ì¶íë©´ userê° ì¸ì¬ë¥¼ í´ì¤ëë¤.
ì´ë ê² ê°ì²´ íë¡í¼í°ì í ë¹ë í¨ì를 ë©ìë(method) ë¼ê³ ë¶ë¦ ëë¤.
ì ìììì userì í ë¹ë sayHiê° ë©ìëì´ì£ .
ë©ìëë ìëì ê°ì´ ì´ë¯¸ ì ìë í¨ì를 ì´ì©í´ì ë§ë¤ ìë ììµëë¤.
let user = {
// ...
};
// í¨ì ì ì¸
function sayHi() {
alert("ìë
íì¸ì!");
};
// ì ì¸ë í¨ì를 ë©ìëë¡ ë±ë¡
user.sayHi = sayHi;
user.sayHi(); // ìë
íì¸ì!
ê°ì²´ë¥¼ ì¬ì©íì¬ ê°ì²´ë¥¼ íííë ë°©ìì ê°ì²´ ì§í¥ íë¡ê·¸ëë°(object-oriented programming, OOP) ì´ë¼ ë¶ë¦ ëë¤.
OOPë ê·¸ ìì²´ë§ì¼ë¡ë í문ì ë¶ì¼ë¥¼ ë§ëë ì¤ìí 주ì ì ëë¤. ì¬ë°ë¥¸ ê°ì²´ë¥¼ ì ííë ë°©ë², ê°ì²´ ì¬ì´ì ìí¸ìì©ì ëíë´ë ë°©ë² ë±ì ê´í ìì¬ê²°ì ì ê°ì²´ ì§í¥ ì¤ê³ë¥¼ 기ë°ì¼ë¡ ì´ë¤ì§ëë¤. ê°ì²´ ì§í¥ íë¡ê·¸ëë° ê´ë ¨ ì¶ì²ëìë¡ë ìë¦ ê°ë§ì âGoFì ëìì¸ í¨í´â, ê·¸ëë ë¶ì¹ì âUMLì íì©í ê°ì²´ì§í¥ ë¶ì ì¤ê³â ë±ì´ ììµëë¤.
ë©ìë ë¨ì¶ 구문
ê°ì²´ 리í°ë´ ìì ë©ìë를 ì ì¸í ë ì¬ì©í ì ìë ë¨ì¶ 문ë²ì ìê°í´ ëë¦¬ê² ìµëë¤.
// ìë ë ê°ì²´ë ëì¼íê² ëìí©ëë¤.
user = {
sayHi: function() {
alert("Hello");
}
};
// ë¨ì¶ 구문ì ì¬ì©íë ë ê¹ëí´ ë³´ì´ë¤ì.
user = {
sayHi() { // "sayHi: function()"ê³¼ ëì¼í©ëë¤.
alert("Hello");
}
};
ìì²ë¼ functionì ìëµí´ë ë©ìë를 ì ìí ì ììµëë¤.
ì¼ë°ì ì¸ ë°©ë²ê³¼ ë¨ì¶ 구문ì ì¬ì©í ë°©ë²ì´ ìì í ëì¼íì§ ììµëë¤. ê°ì²´ ììê³¼ ê´ë ¨ë 미ë¬í ì°¨ì´ê° ì¡´ì¬íëë° ì§ê¸ì¼ë¡ì ì´ ì°¨ì´ê° ì¤ìíì§ ì기 ë문ì ëì´ê°ëë¡ íê² ìµëë¤.
ë©ìëì this
ë©ìëë ê°ì²´ì ì ì¥ë ì ë³´ì ì ê·¼í ì ìì´ì¼ ì ìí ì í ì ììµëë¤. 모ë ë©ìëê° ê·¸ë° ê±´ ìëì§ë§, ëë¶ë¶ì ë©ìëê° ê°ì²´ íë¡í¼í°ì ê°ì íì©í©ëë¤.
user.sayHi()ì ë´ë¶ ì½ëìì ê°ì²´ userì ì ì¥ë ì´ë¦(name)ì ì´ì©í´ ì¸ì¬ë§ì ë§ëë ê²½ì°ê° ì´ë° ê²½ì°ì ìí©ëë¤.
ë©ìë ë´ë¶ìì this í¤ìë를 ì¬ì©íë©´ ê°ì²´ì ì ê·¼í ì ììµëë¤.
ì´ë 'ì ìâì thisë ê°ì²´ë¥¼ ëíë
ëë¤. ì ííë ë©ìë를 í¸ì¶í ë ì¬ì©ë ê°ì²´ë¥¼ ëíë´ì£ .
ìì:
let user = {
name: "John",
age: 30,
sayHi() {
// 'this'ë 'íì¬ ê°ì²´'를 ëíë
ëë¤.
alert(this.name);
}
};
user.sayHi(); // John
user.sayHi()ê° ì¤íëë ëìì thisë user를 ëíë
ëë¤.
this를 ì¬ì©íì§ ìê³ ì¸ë¶ ë³ì를 ì°¸ì¡°í´ ê°ì²´ì ì ê·¼íë ê²ë ê°ë¥í©ëë¤.
let user = {
name: "John",
age: 30,
sayHi() {
alert(user.name); // 'this' ëì 'user'를 ì´ì©í¨
}
};
ê·¸ë°ë° ì´ë ê² ì¸ë¶ ë³ì를 ì¬ì©í´ ê°ì²´ë¥¼ 참조íë©´ ììì¹ ëª»í ìë¬ê° ë°ìí ì ììµëë¤. user를 ë³µì¬í´ ë¤ë¥¸ ë³ìì í ë¹(admin = user)íê³ , userë ì í ë¤ë¥¸ ê°ì¼ë¡ ë®ì´ì¼ë¤ê³ ê°ì í´ ë´
ìë¤. sayHi()ë ìì¹ ìë ê°(null)ì 참조í ê²ëë¤.
ìì:
let user = {
name: "John",
age: 30,
sayHi() {
alert( user.name ); // Error: Cannot read property 'name' of null
}
};
let admin = user;
user = null; // user를 nullë¡ ë®ì´ìëë¤.
admin.sayHi(); // sayHi()ê° ìë±í ê°ì²´ë¥¼ ì°¸ê³ íë©´ì ìë¬ê° ë°ìíìµëë¤.
alert í¨ìê° user.name ëì this.nameì ì¸ìë¡ ë°ìë¤ë©´ ìë¬ê° ë°ìíì§ ììì ê²ëë¤.
ìì ë¡ì´ this
ìë°ì¤í¬ë¦½í¸ì thisë ë¤ë¥¸ íë¡ê·¸ëë° ì¸ì´ì thisì ëì ë°©ìì´ ë¤ë¦
ëë¤. ìë°ì¤í¬ë¦½í¸ìì 모ë í¨ìì this를 ì¬ì©í ì ììµëë¤.
ìëì ê°ì´ ì½ë를 ìì±í´ë ë¬¸ë² ìë¬ê° ë°ìíì§ ììµëë¤.
function sayHi() {
alert( this.name );
}
this ê°ì ë°íìì ê²°ì ë©ëë¤. 컨í
ì¤í¸ì ë°ë¼ ë¬ë¼ì§ì£ .
ëì¼í í¨ìë¼ë ë¤ë¥¸ ê°ì²´ìì í¸ì¶íë¤ë©´ 'thisâê° ì°¸ì¡°íë ê°ì´ ë¬ë¼ì§ëë¤.
let user = { name: "John" };
let admin = { name: "Admin" };
function sayHi() {
alert( this.name );
}
// ë³ê°ì ê°ì²´ìì ëì¼í í¨ì를 ì¬ì©í¨
user.f = sayHi;
admin.f = sayHi;
// 'this'ë 'ì (.) ìì' ê°ì²´ë¥¼ 참조í기 ë문ì
// this ê°ì´ ë¬ë¼ì§
user.f(); // John (this == user)
admin.f(); // Admin (this == admin)
admin['f'](); // Admin (ì ê³¼ ëê´í¸ë ëì¼íê² ëìí¨)
ê·ì¹ì ê°ë¨í©ëë¤. obj.f()를 í¸ì¶íë¤ë©´ thisë f를 í¸ì¶íë ëìì objì
ëë¤. ì ìììì objê° userë adminì 참조íê² ì£ .
this == undefinedê°ì²´ê° ìì´ë í¨ì를 í¸ì¶í ì ììµëë¤.
function sayHi() {
alert(this);
}
sayHi(); // undefined
ìì ê°ì ì½ë를 ì격 모ëìì ì¤ííë©´, thisì undefinedê° í ë¹ë©ëë¤. this.nameì¼ë¡ nameì ì ê·¼íë ¤ê³ íë©´ ìë¬ê° ë°ìíì£ .
ê·¸ë°ë° ì격 모ëê° ìë ëë thisê° ì ì ê°ì²´ë¥¼ 참조í©ëë¤. ë¸ë¼ì°ì íê²½ìì windowë¼ë ì ì ê°ì²´ë¥¼ 참조íì£ . ì´ë° ëì ì°¨ì´ë "use strict"ê° ëì
ë ë°°ê²½ì´ê¸°ë í©ëë¤. ì ì ê°ì²´ë ì ì ê°ì²´ìì ìì¸í ë¤ë£° ìì ì
ëë¤.
ì´ë° ìì ì½ëë ëê° ì¤ìë¡ ìì±ë ê²½ì°ê° ë§ìµëë¤. í¨ì 본문ì thisê° ì¬ì©ëìë¤ë©´, ê°ì²´ 컨í
ì¤í¸ ë´ìì í¨ì를 í¸ì¶í ê²ì´ë¼ê³ ììíìë©´ ë©ëë¤.
thisê° ë§ëë ê²°ê³¼ë¤ë¥¸ ì¸ì´ë¥¼ ì¬ì©íë¤ ìë°ì¤í¬ë¦½í¸ë¡ ëì´ì¨ ê°ë°ìë this를 í¼ëí기 ì½ìµëë¤. thisë íì ë©ìëê° ì ìë ê°ì²´ë¥¼ 참조í ê²ì´ë¼ê³ ì°©ê°íì£ . ì´ë° ê°ë
ì 'bound thisâë¼ê³ í©ëë¤.
ìë°ì¤í¬ë¦½í¸ìì thisë ë°íìì ê²°ì ë©ëë¤. ë©ìëê° ì´ëì ì ìëìëì§ì ìê´ìì´ thisë âì ììâ ê°ì²´ê° 무ìì¸ê°ì ë°ë¼ âìì ë¡ê²â ê²°ì ë©ëë¤.
ì´ë ê² thisê° ë°íìì ê²°ì ëë©´ ì¢ì ì ë ìê³ ëì ì ë ììµëë¤. í¨ì(ë©ìë)를 íëë§ ë§ë¤ì´ ì¬ë¬ ê°ì²´ìì ì¬ì¬ì©í ì ìë¤ë ê²ì ì¥ì ì´ì§ë§, ì´ë° ì ì°í¨ì´ ì¤ìë¡ ì´ì´ì§ ì ìë¤ë ê²ì ë¨ì ì
ëë¤.
ìë°ì¤í¬ë¦½í¸ê° this를 ë¤ë£¨ë ë°©ìì´ ì¢ìì§, ëìì§ë ì°ë¦¬ê° íë¨í 문ì ê° ìëëë¤. ê°ë°ìë thisì ëì ë°©ìì ì¶©ë¶í ì´í´íê³ ì¥ì ì ì·¨íë©´ì ì¤ì를 í¼íë ë°ë§ ì§ì¤íë©´ ë©ëë¤.
thisê° ìë íì´í í¨ì
íì´í í¨ìë ì¼ë° í¨ììë ë¬ë¦¬ âê³ ì íâ this를 ê°ì§ì§ ììµëë¤. íì´í í¨ììì this를 참조íë©´, íì´í í¨ìê° ìë âíë²íâ ì¸ë¶ í¨ììì this ê°ì ê°ì ¸ìµëë¤.
ìë ìììì í¨ì arrow()ì thisë ì¸ë¶ í¨ì user.sayHi()ì thisê° ë©ëë¤.
let user = {
firstName: "ë³´ë¼",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // ë³´ë¼
ë³ê°ì thisê° ë§ë¤ì´ì§ë ê±´ ìíì§ ìê³ , ì¸ë¶ 컨í
ì¤í¸ì ìë this를 ì´ì©íê³ ì¶ì ê²½ì° íì´í í¨ìê° ì ì©í©ëë¤. ì´ì ëí ìì¸í ë´ì©ì ë³ëì ì±í°, íì´í í¨ì ë¤ì ì´í´ë³´ê¸°ìì ë¤ë£¨ê² ìµëë¤.
ìì½
- ê°ì²´ íë¡í¼í°ì ì ì¥ë í¨ì를 'ë©ìëâë¼ê³ ë¶ë¦ ëë¤.
object.doSomthing()ì ê°ì²´ë¥¼ 'íëâí ì ìê² í´ì¤ëë¤.- ë©ìëë
thisë¡ ê°ì²´ë¥¼ 참조í©ëë¤.
this ê°ì ë°íìì ê²°ì ë©ëë¤.
- í¨ì를 ì ì¸í ë
this를 ì¬ì©í ì ììµëë¤. ë¤ë§, í¨ìê° í¸ì¶ë기 ì ê¹ì§thisì ê°ì´ í ë¹ëì§ ììµëë¤. - í¨ì를 ë³µì¬í´ ê°ì²´ ê° ì ë¬í ì ììµëë¤.
- í¨ì를 ê°ì²´ íë¡í¼í°ì ì ì¥í´
object.method()ê°ì´ âë©ìëâ ííë¡ í¸ì¶íë©´thisëobject를 참조í©ëë¤.
íì´í í¨ìë ìì ë§ì this를 ê°ì§ì§ ìëë¤ë ì ìì ë
í¹í©ëë¤. íì´í í¨ì ììì this를 ì¬ì©íë©´, ì¸ë¶ìì this ê°ì ê°ì ¸ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.