ì´ ì ì 첫 ë²ì§¸ ì±í°ìì íë¡í íì ì ì¤ì í기 ìí 모ëí ë°©ë²ì´ ìë¤ê³ ì¸ê¸íìµëë¤.
__proto__ë ë¸ë¼ì°ì 를 ëìì¼ë¡ ê°ë°íê³ ìë¤ë©´ ë¤ì 구ìì´ê¸° ë문ì ëë ì¬ì©íì§ ìë ê²ì´ ì¢ìµëë¤. íì¤ìë ê´ë ¨ ë´ì©ì´ ëª
ìëì´ììµëë¤.
ëì ìëì ê°ì 모ëí ë©ìëë¤ì ì¬ì©íë ê²ì´ ì¢ìµëë¤.
- Object.create(proto, [descriptors]) â
[[Prototype]]ì´proto를 참조íë ë¹ ê°ì²´ë¥¼ ë§ëëë¤. ì´ë íë¡í¼í° ì¤ëª ì를 ì¶ê°ë¡ ë길 ì ììµëë¤. - Object.getPrototypeOf(obj) â
objì[[Prototype]]ì ë°íí©ëë¤. - Object.setPrototypeOf(obj, proto) â
objì[[Prototype]]ì´protoê° ëëë¡ ì¤ì í©ëë¤.
ìì¼ë¡ ìë ììì²ë¼ __proto__ ëì ë©ìë를 ì¬ì©íëë¡ í©ìë¤.
ìì:
let animal = {
eats: true
};
// íë¡í íì
ì´ animalì¸ ìë¡ì´ ê°ì²´ë¥¼ ìì±í©ëë¤.
let rabbit = Object.create(animal);
alert(rabbit.eats); // true
alert(Object.getPrototypeOf(rabbit) === animal); // true
Object.setPrototypeOf(rabbit, {}); // rabbitì íë¡í íì
ì {}ì¼ë¡ ë°ê¿ëë¤.
ë©ìë를 ìê°í ë ì ì ì¸ê¸í ê²ì²ë¼ Object.createìë íë¡í¼í° ì¤ëª
ì를 ì íì ì¼ë¡ ì ë¬í ì ììµëë¤. ì¤ëª
ì를 ì´ì©í´ ì ê°ì²´ì íë¡í¼í°ë¥¼ ì¶ê°í´ ë³´ê² ìµëë¤.
let animal = {
eats: true
};
let rabbit = Object.create(animal, {
jumps: {
value: true
}
});
alert(rabbit.jumps); // true
ì¤ëª ìë íë¡í¼í° íëê·¸ì ì¤ëª ììì ë°°ì´ ê²ê³¼ ê°ì ííë¡ ì¬ì©íë©´ ë©ëë¤.
Object.create를 ì¬ì©íë©´ for..inì ì¬ì©í´ íë¡í¼í°ë¥¼ ë³µì¬íë ê²ë³´ë¤ ë í¨ê³¼ì ì¼ë¡ ê°ì²´ë¥¼ ë³µì í ì ììµëë¤.
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
Object.create를 í¸ì¶íë©´ objì 모ë íë¡í¼í°ë¥¼ í¬í¨í ìë²½í ì¬ë³¸ì´ ë§ë¤ì´ì§ëë¤, ì¬ë³¸ì ì´ê±° ê°ë¥í íë¡í¼í°ì ë¶ê°ë¥í íë¡í¼í°, ë°ì´í° íë¡í¼í°, getter, setter ë± ëª¨ë íë¡í¼í°ê° ë³µì ë©ëë¤. [[Prototype]]ë ë³µì ëì£ .
ë¹íì¸ë ì¤í 리
[[Prototype]]ì ë¤ë£¨ë ë°©ë²ì ë¤ìí©ëë¤. 목íë íëì¸ë° 목í를 ì´ë£¨ê¸° ìí ìë¨ì ì¬ë¬ ê°ì§ì´ì£ .
ì ê·¸ë´ê¹ì?
ìì¬ì ì¸ ì´ì ê° ììµëë¤.
- ìì±ì í¨ìì
"prototype"íë¡í¼í°ë ì주 ì¤ëì ë¶í° ì¬ì©ëê³ ìììµëë¤. - ê·¸ë°ë° 2012ë
, ëª
ì¸ìì
Object.createê° ì¶ê°ëììµëë¤.Object.create를 ì¬ì©íë©´ 주ì´ì§ íë¡í íì ì ì¬ì©í´ ê°ì²´ë¥¼ ë§ë¤ ì ì긴 íì§ë§, íë¡í íì ì ì»ê±°ë ì¤ì íëê²ì ë¶ê°ë¥íìµëë¤. ê·¸ëì ë¸ë¼ì°ì ë ë¹íì¤ ì ê·¼ìì¸__proto__를 구íí´ ì¸ì ë íë¡í íì ì ì»ê±°ë ì¤ì í ì ìëë¡ íììµëë¤. - ì´í 2015ë
ì
Object.setPrototypeOfìObject.getPrototypeOfê° íì¤ì ì¶ê°ëë©´ì__proto__ì ëì¼í 기ë¥ì ìíí ì ìê² ëììµëë¤. ê·¸ë°ë° ì´ ìì ì__proto__를 ì¬ì©íë ê³³ì´ ë무 ë§ìì__proto__ë ì¬ì¤ì íì¤(de-facto standard)ì´ ëì´ë²ë ¸ì£ . ì´ ë´ì©ì ëª ì¸ìì ë¶ë¡ B(Annex B)ì ì¶ê°ëì´ ììµëë¤. ë¶ë¡ Bì ë´ì©ì ë¸ë¼ì°ì ì´ì¸ì í¸ì¤í¸ íê²½ìì ì íì¬íì´ë¼ëê²ì ì미í©ëë¤.
ì´ë° ìì¬ì ì¸ ì´ì ë문ì ì§ê¸ì ì¬ë¬ ë°©ìì ìíë ëë¡ ì¸ ì ìê²ëììµëë¤.
ì´ì¯¤ëë©´ "ì __proto__ê° í¨ì getPrototypeOf, setPrototypeOfë¡ ëì²´ëììê¹?"ë¼ë ìë¬¸ì´ ë ì¤ë¥¼ ì ììµëë¤. í¥ë¯¸ë¡ì´ ì§ë¬¸ì´ì£ . ëµì __proto__ê° ì ëìì§ ì´í´íë©´ ì»ì ì ììµëë¤. ìë ë´ì©ì ê³ì ì½ì¼ë©´ì ëµì ì°¾ìë´
ìë¤.
[[Prototype]]ì ë³ê²½íì§ ë§ì¸ì.ìíë¤ë©´ ì¸ì ë [[Prototype]]ì ì»ê±°ë ì¤ì í ì ììµëë¤. 기ì ì ì ì½ì´ ìë ê±´ ìëì£ . íì§ë§ ëê°ë ê°ì²´ë¥¼ ìì±í ëë§ [[Prototype]]ì ì¤ì íê³ ì´íì ìì íì§ ììµëë¤. rabbitì´ animalì ììë°ëë¡ ì¤ì íê³ ë ì´íì ìì ê´ê³ë¥¼ ì ë³ê²½íì§ ììµëë¤.
ìë°ì¤í¬ë¦½í¸ ìì§ì ì´ë° ìë리ì¤ë¥¼ í ëë¡ ìµì íëì´ ììµëë¤. Object.setPrototypeOfë obj.__proto__=를 ì¨ì íë¡í íì
ì ê·¸ëê·¸ë ë°ê¾¸ë ì°ì°ì ê°ì²´ íë¡í¼í° ì ê·¼ ê´ë ¨ ìµì í를 ë§ì¹ê¸° ë문ì ì±ë¥ì ëì ìí¥ì 미칩ëë¤. ê·¸ë¬ë¯ë¡ [[Prototype]]ì ë°ê¾¸ë ê²ì´ ì´ë¤ 결과를 ì´ëí ì§ íì¤í ìê±°ë ìëê° ì í ì¤ìíì§ ìì ê²½ì°ê° ìëë¼ë©´ [[Prototype]]ì ë°ê¾¸ì§ ë§ì¸ì.
ì주 ë¨ìí ê°ì²´
ìë¤ìí¼ ê°ì²´ë í¤-ê° ìì´ ìë ì°ê´ ë°°ì´ë¡ë ì¬ì©í ì ììµëë¤.
ê·¸ë°ë° 커ì¤í
ì¬ì ì ë§ëë ê²ê³¼ ê°ì´ ì¬ì©ìê° ì§ì ì
ë ¥í í¤ë¥¼ ê°ì§ê³ ê°ì²´ë¥¼ ë§ë¤ë¤ ë³´ë©´ ì¬ìí ê²°í¨ì´ ë°ê²¬ë©ëë¤. ë¤ë¥¸ 문ìì´ì ê´ì°®ì§ë§ "__proto__"ë¼ë 문ìì´ì í¤ë¡ ì¬ì©í ì ìë¤ë ê²°í¨ì´ì£ .
ìì를 ì´í´ë´ ìë¤.
let obj = {};
let key = prompt("ì
ë ¥íê³ ì íë keyë 무ìì¸ê°ì?", "__proto__");
obj[key] = "...ê°...";
alert(obj[key]); // "...ê°..."ì´ ìë [object Object]ê° ì¶ë ¥ë©ëë¤.
í롬íí¸ ì°½ì __proto__를 ì
ë ¥íë©´ ê°ì´ ì ëë¡ í ë¹ëì§ ìëê²ì íì¸í ì ììµëë¤.
__proto__ íë¡í¼í°ë í¹ë³í íë¡í¼í°ë¼ë ê²ì ì´ë¯¸ ìê³ ì기 ë문ì ê·¸ë ê² ëëë§í ì¼ì ìë긴 í©ëë¤. ì°¸ê³ ë¡ __proto__ë íì ê°ì²´ì´ê±°ë nullì´ì´ì¼ í©ëë¤. 문ìì´ì íë¡í íì
ì´ ë ì ììµëë¤.
ê°ë°ìê° ì ììì ê°ì ì½ë를 ìì±í ë ì´ë° 결과를 ìëíë©´ì 구ííì§ ììì ê²ëë¤. í¤ê° 무ìì´ ëìë , í¤-ê° ìì ì ì¥íë ¤ê³ íëë° í¤ê° __proto__ì¼ ë ê°ì´ ì ëë¡ ì ì¥ëì§ ìë ê±´ ëª
ë°±í ë²ê·¸ì´ì£ .
ìììì ì´ ë²ê·¸ê° 그리 ì¹ëª ì ì´ì§ ììµëë¤. ê·¸ë°ë° í ë¹ ê°ì´ ê°ì²´ì¼ ëë íë¡í íì ì´ ë°ë ì ìë¤ë ì¹ëª ì ì¸ ë²ê·¸ê° ë°ìí ì ììµëë¤. íë¡í íì ì´ ë°ëë©´ ììì¹ ëª»í ì¼ì´ ë°ìí ì ì기 ë문ì ëë¤.
ê°ë°ìë¤ì ëê° íë¡í íì ì´ ì¤ê°ì ë°ëë ìë리ì¤ë ë°°ì í ì± ê°ë°ì ì§íí©ëë¤. ì´ë° ê³ ì ê´ë ë문ì íë¡í íì ì´ ì¤ê°ì ë°ëë©´ì ë°ìí ë²ê·¸ë ê·¸ ìì¸ì ì½ê² ì°¾ì§ ëª»í©ëë¤. ìë² ì¬ì´ëìì ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì© í ë ì´ë° ë²ê·¸ê° ì·¨ì½ì ì´ ë기ë í©ëë¤.
toStringì ë¹ë¡¯í ë´ì¥ ë©ìëì í ë¹ì í ëë ê°ì ì´ì ë문ì ììì¹ ëª»í ì¼ì´ ì¼ì´ë ì ììµëë¤.
ê·¸ë¼ ì°ë¦¬ë ì´ë° 문ì 를 ì´ë»ê² ìë°©í ì ììê¹ì?
ê°ì²´ ëì ë§µì ì¬ì©íë©´ ë©ëë¤.
ê·¸ë°ë° ìë°ì¤í¬ë¦½í¸ë¥¼ ë§ë ì¬ëë¤ì´ ì주 ì¤ëì ë¶í° ì´ë° 문ì 를 ê³ ë ¤í기 ë문ì ê°ì²´ë¥¼ ì¨ë 문ì 를 ìë°©í ì ììµëë¤. ê°ì²´ë¥¼ ì¨ì 문ì 를 ìë°©íë ë°©ë²ì ììë´
ìë¤.
ììë¤ìí¼ __proto__ë ê°ì²´ì íë¡í¼í°ê° ìëë¼ Object.prototypeì ì ê·¼ì íë¡í¼í°ì
ëë¤.
ê·¸ë 기 ë문ì obj.__proto__를 ì½ê±°ë ì¸ëë ì´ì ëìíë getter, setterê° íë¡í íì
ìì í¸ì¶ëê³ objë [[Prototype]]ì íµí´ getterì setterì ì ê·¼í©ëë¤.
ì´ ì ì ììí ë ì¸ê¸í ê²ì²ë¼ __proto__ë [[Prototype]]ì ì ê·¼í기 ìí ìë¨ì´ì§ [[Prototype]] ê·¸ ìì²´ê° ìë ê²ì´ì£ .
ì´ì ê°ë¨í í¸ë¦ì ì¨ ê°ì²´ê° ì°ê´ ë°°ì´ì ìí ì ë¤ í ì ìëë¡ í´ë³´ê² ìµëë¤.
let obj = Object.create(null);
let key = prompt("ì
ë ¥íê³ ì íë keyë 무ìì¸ê°ì?", "__proto__");
obj[key] = "...ê°...";
alert(obj[key]); // "...ê°..."ì´ ì ëë¡ ì¶ë ¥ë©ëë¤.
Object.create(null)ì ì¬ì©í´ íë¡í íì
ì´ ìë ë¹ ê°ì²´ë¥¼ ë§ë¤ì´ ë³´ììµëë¤. [[Prototype]]ì´ nullì¸ ê°ì²´ë¥¼ ë§ë ê²ì´ì£ .
Object.create(null)ë¡ ê°ì²´ë¥¼ ë§ë¤ë©´ __proto__ getterì setter를 ììë°ì§ ììµëë¤. ì´ì __proto__ë íë²í ë°ì´í° íë¡í¼í°ì²ë¼ ì²ë¦¬ëë¯ë¡ ë²ê·¸ ìì´ ììê° ì ëìíê² ë©ëë¤.
ì´ë ê² íë¡í íì
ì´ ìë ë¹ ê°ì²´ë âì주 ë¨ìí(very plain)â í¹ì âìì ì¬ì ì(pure dictionary)â ê°ì²´ë¼ê³ ë¶ë¦
ëë¤. ì¼ë° ê°ì²´ {...} ë³´ë¤ í¨ì¬ ë¨ìí©ëë¤.
ì°¸ê³ ë¡ ì주 ë¨ìí ê°ì²´ë ë´ì¥ ë©ìëê° ìë¤ë ë¨ì ì´ ììµëë¤. toStringê°ì ë©ìë를 ì¬ì©í ì ììµëë¤.
let obj = Object.create(null);
alert(obj); // Error: Cannot convert object to primitive value (toStringì´ ìì)
ê°ì²´ë¥¼ ì°ê´ ë°°ì´ë¡ ì¸ ëë ì´ë° ë¨ì ì´ ë¬¸ì ê° ëì§ ììµëë¤.
ê°ì²´ ê´ë ¨ ë©ìë ëë¶ë¶ì Object.keys(obj) ê°ì´ Object.something(...) íí를 ëëë¤. ì´ ë©ìëë¤ì íë¡í íì
ì ìë ê² ìë기 ë문ì 'ì주 ë¨ìí ê°ì²´âìë ì¬ì©í ì ììµëë¤.
let chineseDictionary = Object.create(null);
chineseDictionary.hello = "ä½ å¥½";
chineseDictionary.bye = "åè§";
alert(Object.keys(chineseDictionary)); // hello,bye
ìì½
íë¡í íì ì ì§ì ì ê·¼í ë ë¤ìê³¼ ê°ì 모ëí ë©ìë를 ì¬ì©í ì ììµëë¤.
- Object.create(proto, [descriptors]) â
[[Prototype]]ì´protoì¸ ê°ì²´ë¥¼ ë§ëëë¤. 참조 ê°ìnullì¼ ì ìê³ íë¡í¼í° ì¤ëª ì를 ë기ë ê²ë ê°ë¥í©ëë¤. - Object.getPrototypeOf(obj) â
objì[[Prototype]]ì ë°íí©ëë¤(__proto__getterì ê°ìµëë¤). - Object.setPrototypeOf(obj, proto) â
objì[[Prototype]]ìprotoë¡ ì¤ì í©ëë¤(__proto__setterì ê°ìµëë¤).
ì¬ì©ìê° í¤ë¥¼ ì§ì ë§ë¤ ì ìê² íì©íë©´, ë´ì¥ __proto__ì getter, setter ë문ì ìëíì§ ìì ê²°ê³¼ê° ëì¬ ì ììµëë¤. í¤ê° "__proto__"ì¼ ë ìë¬ê° ë°ìí ì ìì£ . ë¨ìí ìë¬ë©´ ì¢ê² ì§ë§ ë³´íµ ì측 ë¶ê°ë¥í ê²°ê³¼ê° ìê¹ëë¤.
ì´ë¥¼ ë°©ì§íë ¤ë©´ Object.create(null)ì ì¬ì©í´ __proto__ê° ìë 'ì주 ë¨ìí ê°ì²´â를 ë§ë¤ê±°ë, ë§µì ì¬ì©íëê² ì¢ìµëë¤.
íí¸, Object.create를 ì¬ì©íë©´ ê°ì²´ì ìì ë³µì¬ë³¸(shallow-copy)ì ë§ë¤ ì ììµëë¤.
let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
ì§ê¸ê¹ì§ ì°ë¦¬ë __proto__ë [[Prototype]]ì getter, setterë¼ë ì ê³¼ __proto__ë ë¤ë¥¸ ë©ìëì²ë¼ Object.prototypeì ì ìëì´ ìë¤ë ê²ì íì¸í´ ë³´ììµëë¤.
Object.create(null)ì ì¬ì©íë©´ íë¡í íì
ì´ ìë ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤. ì´ë° ê°ì²´ë "__proto__"를 í¤ë¡ ì¬ì©í´ë 문ì 를 ì¼ì¼í¤ì§ ì기 ë문ì 커ì¤í
ì¬ì ì ë§ë¤ ë ì ì©í©ëë¤.
ì§ê¸ê¹ì§ ì´í´ë³¸ ë´ì©ê³¼ ëë¶ì´ ìë ë©ìëë ê°ì´ ì´í´ë³´ë©´ ì¢ìµëë¤.
- Object.keys(obj) / Object.values(obj) / Object.entries(obj) â
objë´ ì´ê±° ê°ë¥í íë¡í¼í° í¤, ê°, í¤-ê° ìì ë´ì ë°°ì´ì ë°íí©ëë¤. - Object.getOwnPropertySymbols(obj) â
objë´ ì¬ë³¼í í¤ë¥¼ ë´ì ë°°ì´ì ë°íí©ëë¤. - Object.getOwnPropertyNames(obj) â
objë´ ë¬¸ìí í¤ë¥¼ ë´ì ë°°ì´ì ë°íí©ëë¤. - Reflect.ownKeys(obj) â
objë´ í¤ ì 체를 ë´ì ë°°ì´ì ë°íí©ëë¤. - obj.hasOwnProperty(key) â ììë°ì§ ìê³
objìì²´ì 구íë í¤ ì¤ ì´ë¦ì´keyì¸ ê²ì´ ìì¼ë©´true를 ë°íí©ëë¤.
Object.keys를 ë¹ë¡¯íì¬ ê°ì²´ì íë¡í¼í°ë¥¼ ë°ííë ë©ìëë¤ì ê°ì²´ê° âì§ì ìì íâ íë¡í¼í°ë§ ë°íí©ëë¤. ìì íë¡í¼í°ë for..inì ì¬ì©í´ ì»ì ì ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.