prototype íë¡í¼í°ë ìë°ì¤í¬ë¦½í¸ ë´ë¶ììë ê´ë²ìíê² ì¬ì©ë©ëë¤. 모ë ë´ì¥ ìì±ì í¨ììì prototype íë¡í¼í°ë¥¼ ì¬ì©í©ëë¤.
ì´ë² ì±í°ìì ë´ì¥ ê°ì²´ì íë¡í íì ì ëí´ ìì¸í ì´í´ë³¸ í, ì´ë»ê² ë´ì¥ ê°ì²´ì íë¡í íì íë¡í¼í°ë¥¼ ìì©í ì ìëì§ ììë³´ê² ìµëë¤.
Object.prototype
ë¹ ê°ì²´ê° ìë¤ê³ ê°ì í´ë´ ìë¤.
let obj = {};
alert( obj ); // "[object Object]" ?
"[object Object]" 문ìì´ì ìì±íë ì½ëë ì´ëì ììê¹ì? toString ë©ìëìì ì´ ë¬¸ìì´ì ìì±íë¤ë ê²ì ìì ë°°ìì ìê³ ìì§ë§ ëëì²´ ì½ëë ì´ëì ìë 걸ê¹ì? objë ë¹ì´ ìëë° ë§ì´ì£ .
obj = new Object()를 ì¤ì´ë©´ obj = {}ê° ë©ëë¤. ì¬ê¸°ì Objectë ë´ì¥ ê°ì²´ ìì±ì í¨ìì¸ë°, ì´ ìì±ì í¨ìì prototypeì toStringì ë¹ë¡¯í ë¤ìí ë©ìëê° êµ¬íëì´ìë ê±°ëí ê°ì²´ë¥¼ 참조í©ëë¤.
그림ì ì´ì©í´ ì´í´ë´ ìë¤.
new Object()를 í¸ì¶íê±°ë 리í°ë´ ë¬¸ë² {...}ì ì¬ì©í´ ê°ì²´ë¥¼ ë§ë¤ ë, ìë¡ê² ìì±ë ê°ì²´ì [[Prototype]]ì ë°ë¡ ì ì±í°ìì ì¸ê¸í ê·ì¹ì ë°ë¼ Object.prototypeì 참조í©ëë¤.
ë°ë¼ì obj.toString()ì í¸ì¶íë©´ Object.prototypeìì í´ë¹ ë©ìë를 ê°ì ¸ì¤ê² ë©ëë¤.
ìì를 íµí´ ì´ë¥¼ íì¸í´ ë´ ìë¤.
let obj = {};
alert(obj.__proto__ === Object.prototype); // true
alert(obj.toString === obj.__proto__.toString); //true
alert(obj.toString === Object.prototype.toString); //true
ê·¸ë°ë° ì´ë Object.prototype ì쪽ì [[Prototype]] ì²´ì¸ì´ ìë¤ë ì ì 주ìíì
ì¼ í©ëë¤.
alert(Object.prototype.__proto__); // null
ë¤ìí ë´ì¥ ê°ì²´ì íë¡í íì
Array, Date, Functionì ë¹ë¡¯í ë´ì¥ ê°ì²´ë¤ ìì íë¡í íì
ì ë©ìë를 ì ì¥í´ ëìµëë¤.
ë°°ì´ [1, 2, 3]ì ë§ë¤ë©´ new Array()ì ëí´í¸ ìì±ìê° ë´ë¶ìì ëìíì¬ Array.prototypeì´ ë°°ì´ [1, 2, 3]ì íë¡í íì
ì´ ëê³ ê°ë°ìë Array.prototypeì íµí´ ë°°ì´ ë©ìë를 ì¬ì©í ì ììµëë¤. ì´ë° ë´ë¶ ëìì ë©ëª¨ë¦¬ í¨ì¨ì ëì¬ì£¼ë ì¥ì ì ê°ì ¸ë¤ì¤ëë¤.
ëª
ì¸ììì 모ë ë´ì¥ íë¡í íì
ì ìì í¸ë¦¬ ê¼ë기ì Object.prototypeì´ ìì´ì¼ íë¤ê³ ê·ì í©ëë¤. ì´ë° ëª
ì¸ ë문ì ëªëª ì¬ëë¤ì "모ë ê²ì ê°ì²´ë¥¼ ììë°ëë¤."ë¼ë ë§ì í기ë í©ëë¤.
ì¸ ë´ì¥ ê°ì²´ë¥¼ ì´ì©í´ ì§ê¸ê¹ì§ ì¤ëª í ë´ì©ì ê·¸ë ¤ë³´ë©´ ë¤ìê³¼ ê°ìµëë¤.
ì´ë²ì ì½ëë¡ ê° ë´ì¥ ê°ì²´ì íë¡í íì ì ì§ì íì¸í´ ë´ ìë¤.
let arr = [1, 2, 3];
// arrì Array.prototypeì ììë°ìëì?
alert( arr.__proto__ === Array.prototype ); // true
// arrì Object.prototypeì ììë°ìëì?
alert( arr.__proto__.__proto__ === Object.prototype ); // true
// ì²´ì¸ ë§¨ ìì nullì´ ììµëë¤.
alert( arr.__proto__.__proto__.__proto__ ); // null
ì²´ì¸ ìì íë¡í íì
ì ì¤ë³µ ë©ìëê° ìì ì ììµëë¤. Array.prototypeì ìì ì¬ì´ì ì¼í를 ë£ì´ ìì ì 체를 í©ì¹ 문ìì´ì ë°ííë ìì²´ ë©ìë toStringì´ ììµëë¤.
let arr = [1, 2, 3]
alert(arr); // 1,2,3 <-- Array.prototype.toStringì ê²°ê³¼
ê·¸ë°ë° Object.prototypeìë ë©ìë toStringì´ ììµëë¤. ì´ë ê² ì¤ë³µ ë©ìëê° ìì ëë ì²´ì¸ ììì ê°ê¹ì´ ê³³ì ìë ë©ìëê° ì¬ì©ë©ëë¤. Array.prototypeì´ ì²´ì¸ ììì ë ê°ê¹ê¸° ë문ì ìììì Array.prototypeì toStringì´ ì¬ì©ëììµëë¤.
Chrome ê°ë°ì ì½ìê³¼ ê°ì ë구를 ì¬ì©íë©´ ìì ê´ê³ë¥¼ íì¸í ì ììµëë¤. console.dir를 ì¬ì©íë©´ ë´ì¥ ê°ì²´ì ìì ê´ê³ë¥¼ íì¸íë ë° ëìì´ ë©ëë¤.
ë°°ì´ì´ ìë ë¤ë¥¸ ë´ì¥ ê°ì²´ë¤ ëí ê°ì ë°©ë²ì¼ë¡ ëìí©ëë¤. í¨ìë ë§ì°¬ê°ì§ì
ëë¤. í¨ìë ë´ì¥ ê°ì²´ Functionì ìì±ì를 ì¬ì©í´ ë§ë¤ì´ì§ëë° call, apply를 ë¹ë¡¯í í¨ììì ì¬ì©í ì ìë ë©ìëë Fuction.prototypeìì ë°ììµëë¤. ì°¸ê³ ë¡ í¨ììë toStringì´ êµ¬íëì´ììµëë¤.
function f() {}
alert(f.__proto__ == Function.prototype); // true
alert(f.__proto__.__proto__ == Object.prototype); // true, ê°ì²´ìì ììë°ì
ììê°
문ìì´ê³¼ ì«ì, ë¶ë¦°ê°ì ë¤ë£¨ë ê²ì ìì² ê¹ë¤ë¡ìµëë¤.
문ìì´ê³¼ ì«ì, ë¶ë¦°ê°ì ê°ì²´ê° ìëëë¤. ê·¸ë°ë° ì´ë° ìì íì
ê°ì íë¡í¼í°ì ì ê·¼íë ¤ê³ íë©´ ë´ì¥ ìì±ì String, Number, Booleanì ì¬ì©íë ìì ëí¼(wrapper) ê°ì²´ê° ìì±ë©ëë¤. ìì ëí¼ ê°ì²´ë ì´ë° ë©ìë를 ì ê³µíê³ ë íì ì¬ë¼ì§ëë¤.
ëí¼ ê°ì²´ë ë³´ì´ì§ ìë ê³³ìì ë§ë¤ì´ì§ëë° ìì§ì ìí´ ìµì íê° ì´ë¤ì§ëë¤. ê·¸ë°ë° ëª
ì¸ìì ê° ìë£íì í´ë¹íë ëí¼ ê°ì²´ì ë©ìë를 íë¡í íì
ìì 구íí´ ëê³ String.prototype, Number.prototype, Boolean.prototypeì ì¬ì©í´ ì°ëë¡ ê·ì í©ëë¤.
nullê³¼ undefinedì ëìíë ëí¼ ê°ì²´ë ììµëë¤.í¹ì ê°ì¸ nullê³¼ undefinedë 문ìì´ê³¼ ì«ì, ë¶ë¦°ê°ê³¼ë ê±°ë¦¬ê° ììµëë¤. nullê³¼ undefinedì ëìíë ëí¼ ê°ì²´ë ììµëë¤. ë°ë¼ì nullê³¼ undefinedìì ë©ìëì íë¡í¼í°ë¥¼ ì´ì©í ì ììµëë¤. íë¡í íì
ë ë¬¼ë¡ ì¬ì©í ì ììµëë¤.
ë¤ì´í°ë¸ íë¡í íì ë³ê²½í기
ë¤ì´í°ë¸ íë¡í íì
ì ìì í ì ììµëë¤. String.prototypeì ë©ìë를 íë ì¶ê°íë©´ 모ë 문ìì´ìì í´ë¹ ë©ìë를 ì¬ì©í ì ììµëë¤.
String.prototype.show = function() {
alert(this);
};
"BOOM!".show(); // BOOM!
ê°ë°ì íë¤ ë³´ë©´ ìë¡ì´ ë´ì¥ ë©ìë를 ë§ë¤ë©´ ì¢ì§ ììê¹ íë ìê°ì´ ë¤ ëê° ììµëë¤. ë¤ì´í°ë¸ íë¡í íì ì ì ë´ì¥ ë©ìë를 ì¶ê°íê³ ì¶ì ì í¹ì´ ì꾸 ìê¸°ì£ . ê·¸ë°ë° ì´ë ì¢ì§ ìì ë°©ë²ì ëë¤.
íë¡í íì
ì ì ìì¼ë¡ ìí¥ì 미ì¹ê¸° ë문ì íë¡í íì
ì ì¡°ìíë©´ 기존 ì½ëì ì¶©ëì´ ë ê°ë¥ì±ì´ í½ëë¤. ë ë¼ì´ë¸ë¬ë¦¬ìì ëìì String.prototype.show ë©ìë를 ì¶ê°íë©´ í ë¼ì´ë¸ë¬ë¦¬ì ë©ìëê° ë¤ë¥¸ ë¼ì´ë¸ë¬ë¦¬ì ë©ìë를 ë®ì´ì°ì£ .
ì´ë° ì´ì ë¡ ë¤ì´í°ë¸ íë¡í íì ì ìì íë ê²ì ì¶ì²íì§ ììµëë¤.
모ë íë¡ê·¸ëë°ìì ë¤ì´í°ë¸ íë¡í íì ë³ê²½ì íì©íë ê²½ì°ë ë± íëë¿ì ëë¤. ë°ë¡ í´ë¦¬íì ë§ë¤ ëì ëë¤.
í´ë¦¬íì ìë°ì¤í¬ë¦½í¸ ëª ì¸ìì ìë ë©ìëì ëì¼í 기ë¥ì íë ë©ìë 구í체를 ì미í©ëë¤. ëª ì¸ììë ì ìëì´ ìì¼ë í¹ì ìë°ì¤í¬ë¦½í¸ ìì§ììë í´ë¹ 기ë¥ì´ 구íëì´ìì§ ìì ë í´ë¦¬íì ì¬ì©í©ëë¤.
í´ë¦¬íì ì§ì 구ííê³ ë í, í´ë¦¬íì ë´ì¥ íë¡í íì ì ì¶ê°í ëë§ ë¤ì´í°ë¸ íë¡í íì ì ë³ê²½í©ìë¤.
ìì:
if (!String.prototype.repeat) { // repeatì´ë¼ë ë©ìëê° ìë¤ê³ ê°ì í©ìë¤
// íë¡í íì
ì repeat를 ì¶ê°
String.prototype.repeat = function(n) {
// stringì ní ë°ë³µ(repeat)í©ëë¤.
// ì¤ì ì´ ë©ìë를 구ííë ¤ë©´ ë ë³µì¡í ì½ëê° íìí©ëë¤.
// ì ì²´ ìê³ ë¦¬ì¦ì ëª
ì¸ììì íì¸í ì ìëë°,
// ëª
ì¸ì를 ìë²½í 구ííì§ ìì í´ë¦¬íì´ë¼ë ì¶©ë¶í ì¸ë§íë ììë ì´ ì ëë¡ë§ ìì±í´ë³´ê² ìµëë¤.
return new Array(n + 1).join(this);
};
}
alert( "ë¼".repeat(3) ); // ë¼ë¼ë¼
íë¡í íì ìì ë©ìë ë¹ë ¤ì¤ê¸°
call/applyì ë°ì½ë ì´í°, í¬ìë©ìì ë©ìë ë¹ë¦¬ê¸°ì ëí ë´ì©ì íìµí ë° ììµëë¤.
í ê°ì²´ì ë©ìë를 ë¤ë¥¸ ê°ì²´ë¡ ë³µì¬í ë ì´ ê¸°ë²ì´ ì¬ì©ë©ëë¤.
ê°ë°ì íë¤ ë³´ë©´ ë¤ì´í°ë¸ íë¡í íì ì 구íë ë©ìë를 ë¹ë ¤ì¼ íë ê²½ì°ê° ì¢ ì¢ ìê¹ëë¤.
ì ì¬ ë°°ì´ ê°ì²´ë¥¼ ë§ë¤ê³ ì¬ê¸°ì Array ë©ìë를 ë³µì¬í´ë´
ìë¤.
ìì:
let obj = {
0: "Hello",
1: "world!",
length: 2,
};
obj.join = Array.prototype.join;
alert( obj.join(',') ); // Hello,world!
ë´ì¥ ë©ìë joinì ë´ë¶ ìê³ ë¦¬ì¦ì ì ëë¡ ë ì¸ë±ì¤ê° ìëì§ì length íë¡í¼í°ê° ìëì§ë§ íì¸í기 ë문ì ììë ìë¬ ìì´ ìëí ëë¡ ëìí©ëë¤. í¸ì¶ ëìì´ ì§ì§ ë°°ì´ì¸ì§ë ìê´ììµëë¤. ì°¸ê³ ë¡ ë¤ìì ë´ì¥ ë©ìëê° ì´ë° ìì¼ë¡ ëìí©ëë¤.
ë©ìë ë¹ë¦¬ê¸° ë§ê³ ë obj.__proto__를 Array.prototypeì¼ë¡ ì¤ì í´ ë°°ì´ ë©ìë를 ììë°ë ë°©ë²ì´ ììµëë¤. ì´ë ê² íë©´ objìì 모ë Array ë©ìë를 ì¬ì©í ì ììµëë¤.
ê·¸ë°ë° ìë°ì¤í¬ë¦½í¸ë ë¨ì¼ ììë§ íì©í기 ë문ì ì´ ë°©ë²ì objê° ë¤ë¥¸ ê°ì²´ë¥¼ ììë°ê³ ìì ëë ì¬ì©í ì ììµëë¤.
ë©ìë ë¹ë¦¬ê¸°ë ì¬ë¬ ê°ì²´ìì íìí 기ë¥ì ê°ì ¸ì ìë ê²ì ê°ë¥íê² í´ì£¼ê¸° ë문ì ì ì°í ê°ë°ì ê°ë¥íê² í´ì¤ëë¤.
ìì½
- 모ë ë´ì¥ ê°ì²´ë ë¤ìê³¼ ê°ì ê·ì¹ì ë°ë¦
ëë¤.
- ë©ìëë íë¡í íì
ì ì ì¥ë©ëë¤(
Array.prototype,Object.prototype,Date.prototypeë±). - ê°ì²´ ìì²´ì ë°ì´í°ë§ ì ì¥í©ëë¤(ë°°ì´ì ìì, ê°ì²´ì íë¡í¼í°, ë ì§ ë±).
- ë©ìëë íë¡í íì
ì ì ì¥ë©ëë¤(
- ììê° ëí ëí¼ ê°ì²´ì íë¡í íì
ì
Number.prototype,String.prototype,Boolean.prototypeê°ì ë©ìë를 ì ì¥í©ëë¤. ë¤ë§undefinedìnullì ìì¸ì ëë¤. - ë´ì¥ íë¡í íì ì ìì ê°ë¥í©ëë¤. ë´ì¥ íë¡í íì ì ë©ìë를 ë¹ë ¤ì ìë¡ì´ ë©ìë를 ë§ëë ê² ìì ê°ë¥í©ëë¤. ê·¸ë¬ë ë´ì¥ íë¡í íì ë³ê²½ì ëëë¡ íì§ ììì¼ í©ëë¤. ë´ì¥ íë¡í íì ì ìë¡ ëª ì¸ìì ë±ë¡ë 기ë¥ì ì¬ì©íê³ ì¶ìë° ìë°ì¤í¬ë¦½í¸ ìì§ì ì´ ê¸°ë¥ì´ 구íëì´ìì§ ìì ëë§ ë³ê²½íë ê² ì¢ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.