图片来自 kzloser
js的三种对象,即实例对象,构造函数对象,原型对象
红色线prototype属性:
普通对象没有prototype,函数对象都有prototype。
所以实例对象和构造函数对象之间没有红线,但是构造函数和原型对象之间有红线。黑色线 constructor属性:原型对象中都有个预定义的constructor对象,用来引用他的函数对象。
F.prototype.constructor = F
Object.prototype.constructor = Object
Array.prototype.constructor = Array
蓝色线 原型链 :js的每一个对象都有个proto内置属性,指向创建他的函数对象的原型对象。so,创建实例对象的函数是构造函数对象(第二列),而他的原型就对应各自的.prototype即原型对象(第三列)。
所有原型对象的proto 指向的都是 Object.prototype ,除了 Object.prototype 本身,它自己是指向 null ,即原型链终点是null。绿色线 构造函数产生的实例对象,通过new XX() 所得到的实例。
紫色线 proto的由来,其实和蓝色线是相同的,因为
第二列构造函数对象.prototype = 第三列原型对象
下面是另一张图,也很好。
和原型有关的API
instanceof, 测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性
object instanceof constructor
检测 constructor.prototype 是否存在于参数 object 的原型链上
Object.getPrototypeOf(obj)得到obj的原型