instanceof æä½ç¬¦ç¨äºæ£æ¥ä¸ä¸ªå¯¹è±¡æ¯å¦å±äºæä¸ªç¹å®ç classãåæ¶ï¼å®è¿èèäºç»§æ¿ã
å¨è®¸å¤æ åµä¸ï¼å¯è½é½éè¦è¿è¡æ¤ç±»æ£æ¥ãä¾å¦ï¼å®å¯ä»¥è¢«ç¨æ¥æå»ºä¸ä¸ª 夿æ§ï¼polymorphicï¼ ç彿°ï¼è¯¥å½æ°æ ¹æ®åæ°çç±»å坹忰è¿è¡ä¸åçå¤çã
instanceof æä½ç¬¦
è¯æ³ï¼
obj instanceof Class
妿 obj é¶å±äº Class ç±»ï¼æ Class ç±»çè¡çç±»ï¼ï¼åè¿å trueã
ä¾å¦ï¼
class Rabbit {}
let rabbit = new Rabbit();
// rabbit æ¯ Rabbit class ç对象åï¼
alert( rabbit instanceof Rabbit ); // true
å®è¿å¯ä»¥ä¸æé 彿°ä¸èµ·ä½¿ç¨ï¼
// è¿éæ¯æé 彿°ï¼è䏿¯ class
function Rabbit() {}
alert( new Rabbit() instanceof Rabbit ); // true
â¦â¦ä¸è¯¸å¦ Array ä¹ç±»çå
建 class ä¸èµ·ä½¿ç¨ï¼
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ï¼é£å°±ç´æ¥è°ç¨è¿ä¸ªæ¹æ³ï¼ä¾å¦ï¼
// 设置 instanceOf æ£æ¥ // å¹¶åè®¾å ·æ canEat 屿§ç齿¯ animal class Animal { static [Symbol.hasInstance](obj) { if (obj.canEat) return true; } } let obj = { canEat: true }; alert(obj instanceof Animal); // trueï¼Animal[Symbol.hasInstance](obj) 被è°ç¨ -
大夿° class 没æ
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ï¼æä»¥ç«å³å°±ç»åºäºç»æãèå¨ç»§æ¿çä¾åä¸ï¼å¹é å°å¨ç¬¬äºæ¥è¿è¡ï¼
class Animal {} class Rabbit extends Animal {} let rabbit = new Rabbit(); alert(rabbit instanceof Animal); // true // rabbit.__proto__ === Animal.prototypeï¼æ å¹é ï¼ // rabbit.__proto__.__proto__ === Animal.prototypeï¼å¹é ï¼ï¼
ä¸å¾å±ç¤ºäº rabbit instanceof Animal çæ§è¡è¿ç¨ä¸ï¼Animal.prototype æ¯å¦ä½å䏿¯è¾çï¼
è¿éè¿è¦æå°ä¸ä¸ªæ¹æ³ objA.isPrototypeOf(objB)ï¼å¦æ objA å¤å¨ objB çååé¾ä¸ï¼åè¿å trueãæä»¥ï¼å¯ä»¥å° obj instanceof Class æ£æ¥æ¹ä¸º Class.prototype.isPrototypeOf(obj)ã
è¿å¾æè¶£ï¼ä½æ¯ Class ç constructor èªèº«æ¯ä¸å䏿£æ¥çï¼æ£æ¥è¿ç¨åªåååé¾ä»¥å Class.prototype æå
³ã
å建对象åï¼å¦ææ´æ¹ prototype 屿§ï¼å¯è½ä¼å¯¼è´æè¶£çç»æã
å°±åè¿æ ·ï¼
function Rabbit() {}
let rabbit = new Rabbit();
// ä¿®æ¹äº prototype
Rabbit.prototype = {};
// ...åä¹ä¸æ¯ rabbit äºï¼
alert( rabbit instanceof Rabbit ); // false
ç¦å©ï¼ä½¿ç¨ Object.prototype.toString æ¹æ³æ¥æç¤ºç±»å
大家é½ç¥éï¼ä¸ä¸ªæ®é对象被转å为å符串æ¶ä¸º [object Object]ï¼
let obj = {};
alert(obj); // [object Object]
alert(obj.toString()); // åä¸
è¿æ¯éè¿ toString æ¹æ³å®ç°çã使¯è¿å¿æä¸ä¸ªéèçåè½ï¼è¯¥åè½å¯ä»¥ä½¿ toString å®é
䏿¯è¿æ´å¼ºå¤§ãæä»¬å¯ä»¥å°å
¶ä½ä¸º typeof çå¢å¼ºçæè
instanceof çæ¿ä»£æ¹æ³æ¥ä½¿ç¨ã
å¬èµ·æ¥æºä¸å¯æè®®ï¼é£æ¯èªç¶ï¼ç²¾å½©é©¬ä¸ææã
æç
§ è§è æè®²ï¼å
建ç toString æ¹æ³å¯ä»¥è¢«ä»å¯¹è±¡ä¸æååºæ¥ï¼å¹¶å¨ä»»ä½å
¶ä»å¼çä¸ä¸æä¸æ§è¡ãå
¶ç»æåå³äºè¯¥å¼ã
- å¯¹äº number ç±»åï¼ç»ææ¯
[object Number] - å¯¹äº boolean ç±»åï¼ç»ææ¯
[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.call æ¿ä»£ instanceofã
æ»ç»
让æä»¬æ»ç»ä¸ä¸æä»¬ç¥éçç±»åæ£æ¥æ¹æ³ï¼
| ç¨äº | è¿åå¼ | |
|---|---|---|
typeof |
åå§æ°æ®ç±»å | string |
{}.toString |
åå§æ°æ®ç±»åï¼å
建对象ï¼å
å« Symbol.toStringTag 屿§ç对象 |
string |
instanceof |
对象 | true/false |
æ£å¦æä»¬æçå°çï¼ä»ææ¯ä¸è®²ï¼{}.toString æ¯ä¸ç§âæ´é«çº§çâ typeofã
å½æä»¬ä½¿ç¨ç±»ç屿¬¡ç»æï¼hierarchyï¼ï¼å¹¶æ³è¦å¯¹è¯¥ç±»è¿è¡æ£æ¥ï¼åæ¶è¿è¦èèç»§æ¿æ¶ï¼è¿ç§åºæ¯ä¸ instanceof æä½ç¬¦ç¡®å®å¾åºè²ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼