<script type="text/javascript">
//自定义一个构造函数
function Fun(){}
//利用上面的构造函数构造一个实例
var fun1 = new Fun()
console.log(fun1 instanceof Fun) //true
console.log(fun1 instanceof Function) //false
console.log(fun1 instanceof Object) //true
</script>
Instanceof
运算符的前面的,暂时称为A;后面一般是一个函数,暂时称为B。
Instanceof
的判断规则是:沿着A的__proto__
这条线来找,同时沿着B的prototype
这条线来找,如果能找到同一个引用,返回true
,否则返回false
。
那我们来按照这个规则一个一个来验证上面的结果:
注意:每个函数都有一个prototype
属性(原型),是一个对象,每个对象都有一个__proto__
(隐式原型),指向它的构造函数的 prototype(原型)
(也是一个对象),对象没有prototype
- 1、
fun1 instanceof Fun
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了,万物皆对象就是这意思,所以它没有构造函数了,所以也就没{Object的原型}.__proto__
了,结束
思如果再{Object的原型}.__proto__
会得到null
,可以再控制台的console
面板试试
第一步: Fun.prototype={Fun的原型}
{Funde原型}
是一个对象,对象没有prototype
,结束
从上可以看出,在第一步A和B就找到同一个引用,所以返回true
注意:因为prototype
是一个对象,所以它的__proro__
就是Object.prototype
- 2、
fun1 instanceof Function
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了,所以它没有构造函数了,所以也就没{Object的原型}.__proto__
了,结束
第一步: Function.prototype={Function的原型}
{Function的原型}
是一个对象,没有prototype
,结束
可以看出fun1和Fun始终没有找到同一个引用
- 3、
fun1 instanceof Object
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了,所以它没有构造函数了,所以也就没{Object的原型}.__proto__
了,结束
第一步: Object.prototype={Object的原型}
{Object的原型}
是一个对象,没有prototype
,结束
从上可以看出,fun1和Object最后找到了同一个引用