探索intanceof

92 阅读2分钟
instanceof是如何判断的?
如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false
+表达式: A instanceof B
  • A 是一个实例对象,B 是一个构造函数对象
  • B 是一个函数,有显式原型属性
  • A 是实例对象,有隐式原型属性,这个隐式原型指向原型对象(一般是函数有prototype属性,这个称为原型对象),原型对象也是个实例对象,有个原型链的问题
+原理:如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false
  • 实例对象有隐式原型指向一个对象,而这个对象可能又是(另一个构造函数的)实例对象拥有隐式原型属性,指向下一个对象,反复如此形成一个原型链,原型链的尽头是Object.prototype对象(Object原型对象)中的__proto__属性,这个__proto__属性值为null

image.png 如果B的显式原型对象是上图中的这些方框中的一个的话,就说明A是B的实例,返回true

原理解释:

image-20220416235810075.png 为什么会有上面这个红框中的__proto__,有这个就说明Foo.prototype对象是个实例对象。为什么呢,因为函数Foo的prototype属性默认是个空Object实例对象,是谁的实例,是Object函数的实例,相当于

function Object () {}

Foo.prototype = new Object ()

实例对象的隐式原型等于构造函数的显式原型

image-20220416235820961.png

Object原型对象的隐式原型为null

image-20220416235830612.png

Object instanceof Function

image-20220416235855191.png

Object instanceof Function

image.png

下图为甚么有这个红框中的__proto__属性?

这根线的开头应该是个实例对象,是哪个的实例?即这个Object函数是 new 谁产生的?所有的函数都是new Function () 产生的。实例对象的隐式原型等于构造函数的显式原型,如下 image.png

Object instanceof Object

image.png 下图中为什么会有这个篮筐中的__proto__属性呢?

这根线的开头应该是个实例对象,函数的prototype属性默认是一个空的Object实例对象,实例对象的隐式原型属性指向构造函数的显式原型属性 image.png

所有函数的原型对象默认都是Object的实例,Object函数除外
Function instanceof Function

Function = new Function () , Function 是 new 自己产生的

image.png

Function instanceof Object

image.png

Object instanceof Foo

image.png

image.png