Function.prototype[Symbol.hasInstance]()
åºçº¿
广æ³å¯ç¨
èª 2017å¹´4æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Function å®ä¾ç [Symbol.hasInstance]() æ¹æ³æå®ç¡®å®æé 彿°æ¯å¦å°å¯¹è±¡è¯å«ä¸ºå
¶å®ä¾çé»è®¤è¿ç¨ãå®ç± instanceof è¿ç®ç¬¦è°ç¨ã
è¯æ³
func[Symbol.hasInstance](value)
åæ°
value-
è¦æµè¯ç对象ï¼åå§å¼å§ç»è¿å
falseã
è¿åå¼
妿 func.prototype å¨ value çååé¾ä¸ï¼åè¿å trueï¼å¦åè¿å falsï¼å¦æ value 䏿¯ä¸ä¸ªå¯¹è±¡æ this 䏿¯ä¸ä¸ªå½æ°ï¼åå§ç»è¿å falseã妿 this æ¯ä¸ä¸ªç»å®å½æ°ï¼åè¿å对 value ååºå±ç®æ 彿°è¿è¡ instanceof æµè¯çç»æã
å¼å¸¸
TypeError-
妿
this䏿¯ç»å®å½æ°ä¸this.prototype䏿¯å¯¹è±¡ï¼åä¼æåºæ¤å¼å¸¸ã
æè¿°
instanceof è¿ç®ç¬¦å¨å³æä½æ°åå¨ [Symbol.hasInstance]() æ¹æ³æ¶ä¼è°ç¨è¯¥æ¹æ³ãç±äºææå½æ°é»è®¤ç»§æ¿èª Function.prototypeï¼å®ä»¬é½ä¼å
·æ [Symbol.hasInstance]() æ¹æ³ï¼å æ¤å¤§å¤æ°æ
åµä¸ï¼Function.prototype[Symbol.hasInstance] æ¹æ³æå®äºå³æä½æ°ä¸ºå½æ°æ¶ instanceof çè¡ä¸ºãè¯¥æ¹æ³å®ç°äº instanceof è¿ç®ç¬¦çé»è®¤è¡ä¸ºï¼å½ constructor 没æ [Symbol.hasInstance] æ¹æ³æ¶ä½¿ç¨ç¸åç®æ³ï¼ã
ä¸å¤§å¤æ°æ¹æ³ä¸åï¼Function.prototype[Symbol.hasInstance]() 屿§æ¯ä¸å¯é
ç½®ä¸ä¸å¯åçãè¿æ¯ä¸ä¸ªå®å
¨ç¹æ§ï¼ç¨äºé²æ¢ç»å®å½æ°çåºå±ç®æ 彿°è¢«è·åã请åèè¿ä¸ª StackOverflow åçä¸ç示ä¾ã
示ä¾
>æ¢å¤é»è®¤ç instanceof è¡ä¸º
ä½ å¾å°éè¦ç´æ¥è°ç¨è¿ä¸ªæ¹æ³ãç¸åï¼è¿ä¸ªæ¹æ³æ¯ç± instanceof è¿ç®ç¬¦è°ç¨çãé常æ
åµä¸ï¼ä½ åºè¯¥ææè¿ä¸¤ç§ç»ææ¯çä»·çã
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
å¦æä½ æ³è°ç¨é»è®¤ç instanceof è¡ä¸ºï¼ä½ä¸ç¡®å®æé 彿°æ¯å¦å·²ç»éåäº [Symbol.hasInstance]() æ¹æ³ï¼é£ä¹ä½ å¯ä»¥ä½¿ç¨è¿ä¸ªæ¹æ³ã
class Foo {
static [Symbol.hasInstance](value) {
// èªå®ä¹å®ç°
return false;
}
}
const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype-%symbol.hasinstance%> |