function Person() {} var p = new Person();
从p
对象的原型对象__proto__
里能够看出,constructor
等于Person
,能够得出p
是由Person
这个构造函数建立出来的,而且p
继承自Person.prototype
原型,p.__proto__
与Person.prototype
指向的是同一个原型函数
p.__proto__ === Person.prototype //true
原型也是一个对象,既然是对象就有原型,那么原型的原型是谁呢?由上面的截图能够看出:__proto__:Object
是原型对象的原型,将其展开获得如下截图:工具
p.__proto__.__proto__ === Object.prototype //true
Object.prototype
的原型对象是什么呢?经过调试工具能够获得答案null
,注意这里是null
,并非undefined
,说明它是存在原型定义的,只是定义的值是null
,若是是没有定义的话,这里应该会显示undefined
。null
是原型链的头。经过调试工具查看js
对象的原型结构,当前对象的__proto__
属性下的constructor
属性的类型是当前对象的真实类型,那么当前对象的原型也就是构造函数类型.prototype
。(p
对象的真实类型是Person
,因此p
的原型就是Person.prototype
)根据此结论往下推到,__proto__
属性里的__proto__
属性里的constructor
属性类型也就是__proto__
原型对象的真实类型,__proto__
原型对象的原型对象也是构造函数.prototype
。(__proto__
对象的真实类型是Object
,__proto__
的原型对象是Object.prototype
)Object.prototype
的原型对象是null
,也就到头了。spa
function Person() {} Person.prototype = []; var p = new Person();
原型链结构如图所示:prototype
[]
赋值给了Person
的原型对象,因此默认的原型链发生了改变。[]
至关因而new Array()
原型链结构:调试
p -> [] -> Array.prototype -> Object.prototype -> null
若是默认原型链没有被改变,p
的原型是Person.prototype
,但因为Person.prototype
被[]
赋值了,因此p
的原型是[]
,因为[]
至关因而new Array()
,因此[]
的原型是Array.prototype
,从调试界面中获得Array.prototype
的原型对象是Object.prototype
,最后是null
。code