instanceof æ¼ç®åã§ãªãã¸ã§ã¯ããç¹å®ã®ã¯ã©ã¹ã«å±ãã¦ããã®ãã確èªãããã¨ãã§ãã¾ããã¾ããç¶æ¿ãèæ
®ããã¾ãã
ãã®ãããªãã§ãã¯ãå¿ è¦ãªã±ã¼ã¹ã¯å¤ã ããããããã¾ãããããã§ã¯ããã®åã«å¿ãã¦å¼æ°ãå¥ã ã«æ±ã å¤å½¢(ããªã¢ã¼ãã£ãã¯) 颿°ãæ§ç¯ããããã«ä½¿ç¨ãã¾ãã
instanceof æ¼ç®å
æ§æã¯æ¬¡ã®éãã§ã:
obj instanceof Class
ãã㯠obj ã Class (ã¾ãã¯ããããç¶æ¿ãã¦ããã¯ã©ã¹)ã«å±ãã¦ããå ´åã« true ãè¿ãã¾ãã
ä¾:
class Rabbit {}
let rabbit = new Rabbit();
// Rabbit ã¯ã©ã¹ã®ãªãã¸ã§ã¯ãï¼
alert( rabbit instanceof Rabbit ); // true
ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã§ãåä½ãã¾ãã:
// class ã®ä»£ãã
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ãããã°ãããï¼Class[Symbol.hasInstance](obj)ï¼ã使ãã¾ããããã¯trueã¾ãã¯falseãè¿ãå¿ è¦ããããããã§instanceofã®æ¯ãèããã«ã¹ã¿ãã¤ãºã§ãã¾ãã:ä¾:
// catEat ããããã£ããã¤ãã®ã¯ 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ã®ãããã¿ã¤ããã§ã¼ã³ãã¡ã®1ã¤ã¨çãããããã§ãã¯ãã¾ããè¨ãæããã¨ã以ä¸ã®ãããªæ¯è¼ãè¡ãã¾ã:
obj.__proto__ == Class.prototype obj.__proto__.__proto__ == Class.prototype obj.__proto__.__proto__.__proto__ == Class.prototype ... // ããããã true ã®å ´åã true ãè¿å´ããã¾ã // ããã§ãªãå ´åããã§ã¼ã³ã®æ«å°¾ã«å°éãã㨠false ãè¿ãã¾ãä¸ã®ä¾ã§ã¯ã``rabbit.proto === Rabbit.prototype` ãªã®ã§ãããã«åçãå¾ããã¾ãã
ç¶æ¿ã®ã±ã¼ã¹ã§ã¯ã2ã¤ãã®ã¹ãããã§ããããã¾ã:
class Animal {} class Rabbit extends Animal {} let rabbit = new Rabbit(); alert(rabbit instanceof Animal); // true // rabbit.__proto__ == Rabbit.prototype // rabbit.__proto__.__proto__ === Animal.prototype (match!)
ããã¯ãrabbit instanceof Animal 㨠Animal.prototype ãæ¯è¼ãããã®ã§ãã:
ã¨ããã§ãobjA.isPrototypeOf(objB) ã¨ããã¡ã½ãããããã¾ãããã㯠objA ã objB ã®ãããã¿ã¤ããã§ã¼ã³ã®ã©ããã«ããã° true ãè¿ãã¾ãããªã®ã§ãobj instanceof Class ã®ãã¹ã㯠Class.prototype.isPrototypeOf(obj) ã¨è¨ãæãããã¨ãã§ãã¾ãã
é¢ç½ããã¨ã«ãClass ã³ã³ã¹ãã©ã¯ã¿èªèº«ã¯ãã§ãã¯ã«ã¯åå ãã¾ãã! ãããã¿ã¤ã㨠Class.prototypeã®ãã§ã¼ã³ã ãã§ãã
ãã㯠prototype ã夿´ãããã¨ãã«è峿·±ãçµæã«ã¤ãªããã¾ãã
ãã®ããã«:
function Rabbit() {}
let rabbit = new Rabbit();
// prototype ã夿´ãã¾ã
Rabbit.prototype = {};
// ...ãã rabbit ã§ã¯ããã¾ãã
alert( rabbit instanceof Rabbit ); // false
ãã¾ã: åã®ããã® Object toString
ç§ãã¡ã¯éå¸¸ã®æåå㯠[object Object] ã¨ããæååã«å¤æããããã¨ããã§ã«ç¥ã£ã¦ãã¾ãã:
let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // åã
ããã toString ã®å®è£
ã§ããããããå®éã«ã¯ãããããã¯ããã«å¼·å㪠toString ãä½ãé ããæ©è½ãããã¾ãããããæ¡å¼µãã㦠typeof ã¾ã㯠instanceof ã®ä»£æ¿ã¨ãã¦å©ç¨ãããã¨ãã§ãã¾ãã
å¥å¦ã«èããã¾ããï¼ãããã«ãåããããã説æãã¾ãããã
ã¹ããã¯(specification)ã«ãã£ã¦ãçµã¿è¾¼ã¿ã® 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]
ããã§ã¯ãã³ã³ããã¹ã this=arr ã§é¢æ° objectToString ãå®è¡ããããããã³ã¬ã¼ã¿ã¨è»¢é, call/apply ã®ç« ã§èª¬æãã call ã使ãã¾ããã
å
é¨çã«ã¯ã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
Object toString ã®æ¯ãèãã¯ç¹å¥ãªãªãã¸ã§ã¯ããããã㣠Symbol.toStringTag ã使ç¨ãã¦ã«ã¹ã¿ãã¤ãºã§ãã¾ãã
ä¾:
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â ãããã¾ãã
ããã¯ãåãæååã¨ãã¦åå¾ããã ãã§ãªãããã§ãã¯ããããã«ãçµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã«å¯¾ã㦠instanceof ã®ä»£ããã«ä½¿ç¨ã§ãã¾ãã
ãµããª
ç§ãã¡ãç¥ã£ã¦ããåãã§ãã¯ã¡ã½ããã«ã¤ãã¦å確èªãã¾ããã:
| 対象 | æ»ãå¤ | |
|---|---|---|
typeof |
ããªããã£ã | æåå |
{}.toString |
ããªããã£ã, çµã¿è¾¼ã¿ãªãã¸ã§ã¯ã, Symbol.toStringTag ããã¤ãªãã¸ã§ã¯ã |
æåå |
instanceof |
ãªãã¸ã§ã¯ã | true/false |
ã覧ã®ããã«ã{}.toString ã¯æè¡çã«ã¯ âããé«åº¦ãªâ typeof ã§ãã
ããã¦ãinstanceof æ¼ç®åã¯ãã¯ã©ã¹éå±¤ãæ±ã£ã¦ãã¦ç¶æ¿ãèæ
®ããã¯ã©ã¹ã®ãã§ãã¯ããããå ´åã«æ¬å½ã«è¼ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã