instanceof的作用:instanceof是用来判断左边的对象是否为右边构造函数的实例。
instanceof的是如何判断的?
① 语法:A instanceof B ,A是实例对象,B是构造函数
② 如果B函数的显式原型对象(prototype)在A对象的原型链(__proto__链)上,则返回true,否则返回false。
1. 代码体验
<script> /* 案例1 */ function Foo() {}; let f1 = new Foo(); console.log(f1 instanceof Foo); // true,f1是通过new Foo产生的实例,故为true // f1先通过自身的__proto__到Foo的prototype,然后Foo的prototype是Object的实例对象,所以利用__proto__就到Object的prototype了,从而Object的原型对象的确在f1的原型链上,所以为true console.log(f1 instanceof Object); // true </script>
下图的图解,可以更好的理解上述代码得到的结果:
<script> /* 案例2 */ console.log(Object instanceof Function); // true console.log(Object instanceof Object); // true console.log(Function instanceof Function); // true console.log(Function instanceof Object); // true function Foo(){}; console.log(Object instanceof Foo); // true </script>
上述代码的结果,可以根据下图的关系链条,得到解释。
注意:Function是通过new自己产生的实例,即Function = new Function(),所以Function在作为实例对象时,其__proto__属性指向的是其构造函数的显示原型,即Function.prototype.