instanceof ì°ì°ì를 ì¬ì©íë©´ ê°ì²´ê° í¹ì í´ëì¤ì ìíëì§ ìëì§ë¥¼ íì¸í ì ììµëë¤. instanceofë ìì ê´ê³ë íì¸í´ì¤ëë¤.
íì¸ ê¸°ë¥ì ë¤ìí ê³³ìì ì°ì´ëë°, ì´ë² ì±í°ìì instanceof를 ì¬ì©í´ ì¸ìì íì
ì ë°ë¼ ì´ë¥¼ ë¤ë¥´ê² ì²ë¦¬íë ë¤íì ì¸(polymorphic) í¨ì를 ë§ëëë° ì¬ì©í´ë³´ê² ìµëë¤.
instanceof ì°ì°ì
문ë²ì ìëì ê°ìµëë¤.
obj instanceof Class
objê° Classì ìíê±°ë Class를 ììë°ë í´ëì¤ì ìíë©´ trueê° ë°íë©ëë¤.
ìì:
class Rabbit {}
let rabbit = new Rabbit();
// rabbitì´ í´ëì¤ Rabbitì ê°ì²´ì¸ê°ì?
alert( rabbit instanceof Rabbit ); // true
instanceofë ìì±ì í¨ìììë ì¬ì©í ì ììµëë¤.
// í´ëì¤ê° ìë ìì±ì í¨ì
function Rabbit() {}
alert( new Rabbit() instanceof Rabbit ); // true
Array ê°ì ë´ì¥ í´ëì¤ìë ì¬ì©í ì ììµëë¤.
let arr = [1, 2, 3];
alert( arr instanceof Array ); // true
alert( arr instanceof Object ); // true
ì ìììì arrì í´ëì¤ Objectìë ìíë¤ë ì ì 주목í´ì£¼ì기 ë°ëëë¤. Arrayë íë¡í íì
기ë°ì¼ë¡ Object를 ììë°ìµëë¤.
instanceof ì°ì°ìë ë³´íµ, íë¡í íì
ì²´ì¸ì ê±°ì¬ë¬ ì¬ë¼ê°ë©° ì¸ì¤í´ì¤ ì¬ë¶ë ìì ì¬ë¶ë¥¼ íì¸í©ëë¤. ê·¸ë°ë° ì ì ë©ìë Symbol.hasInstanceì ì¬ì©íë©´ ì§ì íì¸ ë¡ì§ì ì¤ì í ìë ììµëë¤.
obj instanceof Classì ëëµ ìëì ê°ì ìê³ ë¦¬ì¦ì¼ë¡ ëìí©ëë¤.
-
í´ëì¤ì ì ì ë©ìë
Symbol.hasInstanceê° êµ¬íëì´ ìì¼ë©´,obj instanceof Classë¬¸ì´ ì¤íë ë,Class[Symbol.hasInstance](obj)ê° í¸ì¶ë©ëë¤. í¸ì¶ ê²°ê³¼ëtrueëfalseì´ì´ì¼ í©ëë¤. ì´ë° ê·ì¹ì 기ë°ì¼ë¡instanceofì ëìì 커ì¤í°ë§ì´ì§ í ì ììµëë¤.ìì:
// canEat íë¡í¼í°ê° ìì¼ë©´ animalì´ë¼ê³ íë¨í ì ìëë¡ // instanceOfì ë¡ì§ì ì§ì ì¤ì í©ëë¤. class Animal { static [Symbol.hasInstance](obj) { if (obj.canEat) return true; } } let obj = { canEat: true }; alert(obj instanceof Animal); // true, Animal[Symbol.hasInstance](obj)ê° í¸ì¶ë¨ -
ê·¸ë°ë°, ëë¶ë¶ì í´ëì¤ì
Symbol.hasInstanceê° êµ¬íëì´ìì§ ììµëë¤. ì´ë´ ë ì¼ë°ì ì¸ ë¡ì§ì´ ì¬ì©ë©ëë¤.obj instanceOf ClassëClass.prototypeì´objíë¡í íì ì²´ì¸ ìì íë¡í íì ì¤ íëì ì¼ì¹íëì§ íì¸í©ëë¤.ë¹êµë ì°¨ë¡ ì°¨ë¡ ì§íë©ëë¤.
obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // ì´ ì¤ íëë¼ë trueë¼ë©´ true를 ë°íí©ëë¤. // ê·¸ë ì§ ìê³ ì²´ì¸ì ëì ëë¬íë©´ false를 ë°íí©ëë¤.ì ìììì
rabbit.__proto__ === Rabbit.prototypeê°trueì´ê¸° ë문ìinstanceofëtrue를 ë°íí©ëë¤.ììë°ì í´ëì¤ë¥¼ ì¬ì©íë ê²½ì°ì ë ë²ì§¸ ë¨ê³ìì ì¼ì¹ ì¬ë¶ê° íì¸ë©ëë¤.
class Animal {} class Rabbit extends Animal {} let rabbit = new Rabbit(); alert(rabbit instanceof Animal); // true // rabbit.__proto__ === Rabbit.prototype // rabbit.__proto__.__proto__ === Animal.prototype (ì¼ì¹!)
ìë 그림ì rabbit instanceof Animalì ì¤ííì ë Animal.prototypeê³¼ ë¹êµëë ëìë¤ì ë³´ì¬ì¤ëë¤.
íí¸, objAê° objBì íë¡í íì
ì²´ì¸ ì ì´ëê°ì ìì¼ë©´ true를 ë°íí´ì£¼ë ë©ìë, objA.isPrototypeOf(objB)ë ììµëë¤. obj instanceof Classë Class.prototype.isPrototypeOf(obj)ì ëì¼í©ëë¤.
isPrototypeOfë Class ìì±ì를 ì ì¸íê³ í¬í¨ ì¬ë¶ë¥¼ ê²ì¬íë ì ì´ ì¡°ê¸ í¹ì´í©ëë¤. ê²ì¬ ì, íë¡í íì
ì²´ì¸ê³¼ Class.prototypeë§ ê³ ë ¤í©ëë¤.
isPrototypeOfì ì´ë° í¹ì§ì ê°ì²´ ìì± í prototype íë¡í¼í°ê° ë³ê²½ëë ê²½ì° í¹ì´í 결과를 ì´ëí기ë í©ëë¤. ìëì ê°ì´ ë§ì´ì£ .
ìì:
function Rabbit() {}
let rabbit = new Rabbit();
// íë¡í íì
ì´ ë³ê²½ë¨
Rabbit.prototype = {};
// ë ì´ì Rabbitì´ ìëëë¤!
alert( rabbit instanceof Rabbit ); // false
ë³´ëì¤: íì íì¸ì ìí Object.prototype.toString
ì¼ë° ê°ì²´ë¥¼ 문ìì´ë¡ ë³ííë©´ [object Object]ê° ëë¤ë ê²ì ìê³ ê³ì¤ ê²ëë¤.
let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // ê°ì ê²°ê³¼ê° ì¶ë ¥ë¨
ì´ë ê² [object Object]ê° ëë ì´ì ë toStringì 구íë°©ì ë문ì
ëë¤. ê·¸ë°ë° toStringì toStringì ë ê°ë ¥íê² ë§ë¤ì´ì£¼ë 기ë¥ì´ ì¨ê²¨ì ¸ ììµëë¤. toStringì ì¨ê²¨ì§ 기ë¥ì ì¬ì©íë©´ íì¥ typeof, instanceofì ëìì ë§ë¤ ì ììµëë¤.
ìì§ ê°ì´ ì ì¡íìê² ì§ë§, 구체ì ì¼ë¡ ì¤ëª íê² ìµëë¤.
ëª
ì¸ìì ë°ë¥´ë©´, ê°ì²´ìì ë´ì¥ toStringì ì¶ì¶íë ê² ê°ë¥í©ëë¤. ì´ë ê² ì¶ì¶í ë©ìëë 모ë ê°ì ëìì¼ë¡ ì¤íí ì ììµëë¤. í¸ì¶ ê²°ê³¼ë ê°ì ë°ë¼ ë¬ë¼ì§ëë¤.
- ì«ìí â
[object Number] - ë¶ë¦°í â
[object Boolean] nullâ[object Null]undefinedâ[object Undefined]- ë°°ì´ â
[object Array] - ê·¸ì¸ â 커ì¤í°ë§ì´ì§ ê°ë¥
ìì:
// í¸ì를 ìí´ toString ë©ìë를 ë³ìì ë³µì¬í¨
let objectToString = Object.prototype.toString;
// ìë ë³ìì íì
ì 무ìì¼ê¹ì?
let arr = [];
alert( objectToString.call(arr) ); // [object Array]
call/applyì ë°ì½ë ì´í°, í¬ìë© ì±í°ìì ì¤ëª
í callì ì¬ì©í´ 컨í
ì¤í¸ë¥¼ this=arrë¡ ì¤ì íê³ í¨ì objectToString를 ì¤ííììµëë¤.
toString ìê³ ë¦¬ì¦ì ë´ë¶ì ì¼ë¡ this를 ê²ì¬íê³ ììíë 결과를 ë°íí©ëë¤. ìì를 ë ì´í´ë´
ìë¤.
let s = Object.prototype.toString;
alert( s.call(123) ); // [object Number]
alert( s.call(null) ); // [object Null]
alert( s.call(alert) ); // [object Function]
Symbol.toStringTag
í¹ì ê°ì²´ íë¡í¼í° Symbol.toStringTag를 ì¬ì©íë©´ toStringì ëìì 커ì¤í°ë§ì´ì§ í ì ììµëë¤.
ìì:
let user = {
[Symbol.toStringTag]: "User"
};
alert( {}.toString.call(user) ); // [object User]
ëë¶ë¶ì í¸ì¤í¸ íê²½ì ìì²´ ê°ì²´ì ì´ì ì ì¬í íë¡í¼í°ë¥¼ 구íí´ ëê³ ììµëë¤. ë¸ë¼ì°ì ê´ë ¨ ìì ëª ê°ì§ë¥¼ ì´í´ë´ ìë¤.
// í¹ì í¸ì¤í¸ íê²½ì ê°ì²´ì í´ëì¤ì 구íë toStringTag
alert( window[Symbol.toStringTag]); // Window
alert( XMLHttpRequest.prototype[Symbol.toStringTag] ); // XMLHttpRequest
alert( {}.toString.call(window) ); // [object Window]
alert( {}.toString.call(new XMLHttpRequest()) ); // [object XMLHttpRequest]
ì¤í ê²°ê³¼ìì ë³´ë¯ì´ í¸ì¤í¸ íê²½ ê³ ì ê°ì²´ì Symbol.toStringTag ê°ì [object ...]ë¡ ìì¬ì§ ê°ê³¼ ëì¼í©ëë¤.
ì´ì²ë¼ âtypeofâ ì°ì°ìì ê°ë ¥í ë³íë¤(toStringê³¼ toStringTag â ì®ê¸´ì´)ì ìì ìë£íë¿ë§ ìëë¼ ë´ì¥ ê°ì²´ìë ì¬ì©í ì ììµëë¤. ê·¸ë¦¬ê³ ì»¤ì¤í°ë§ì´ì§ê¹ì§ ê°ë¥í©ëë¤.
ë´ì¥ ê°ì²´ì íì
íì¸ì ëì´ì íì
ì 문ìì´ ííë¡ ë°ê³ ì¶ë¤ë©´ instanceof ëì , {}.toString.callì ì¬ì©í ì ììµëë¤.
ìì½
ì§ê¸ê¹ì§ ë°°ì´ íì íì¸ ë©ìë를 ìì½íë©´ ë¤ìê³¼ ê°ìµëë¤.
| ëì ëì | ë°íê° | |
|---|---|---|
typeof |
ììí | 문ìì´ |
{}.toString |
ììí, ë´ì¥ ê°ì²´, Symbol.toStringTagê° ìë ê°ì²´ |
문ìì´ |
instanceof |
ê°ì²´ | trueë false |
ìììì ë³´ìë¯ì´ {}.toStringì typeofë³´ë¤ â기ë¥ì´ ëâ ë§ìµëë¤.
instanceof ì°ì°ìë ê³ì¸µ 구조를 ê°ì§ í´ëì¤ë¥¼ ë¤ë£° ëë í´ëì¤ì ìì ì¬ë¶ë¥¼ íì¸íê³ ì í ë ê·¸ ì§ê°ë¥¼ ë°íí©ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.