默认原型链

function Person() {}
var p = new Person();

clipboard.png

  • p对象的原型对象__proto__里可以看出,constructor等于Person,可以得出p是由Person这个构造函数创建出来的,并且p继承自Person.prototype原型,p.__proto__Person.prototype指向的是同一个原型

    p.__proto__ === Person.prototype //true
  • 原型也是一个对象,既然是对象就有原型,那么原型的原型是谁呢?由上面的截图可以看出:__proto__:Object是原型对象的原型,将其展开得到以下截图:

    clipboard.png

    p.__proto__.__proto__ === Object.prototype //true
  • Object.prototype的原型对象是什么呢?通过调试工具可以得到答案

    clipboard.png

  • 通过上面截图得知,原型对象是null,注意这里是null,并不是undefined,说明它是存在原型定义的,只是定义的值是null,如果是没有定义的话,这里应该会显示undefinednull是原型链的头。

总结

通过调试工具查看js对象的原型结构,当前对象的__proto__属性下的constructor属性的类型是当前对象的真实类型,那么当前对象的原型也就是构造函数类型.prototype。(p对象的真实类型是Person,所以p的原型就是Person.prototype)根据此结论往下推到,__proto__属性里的__proto__属性里的constructor属性类型也就是__proto__原型对象的真实类型,__proto__原型对象的原型对象也是构造函数.prototype。(__proto__对象的真实类型是Object__proto__的原型对象是Object.prototypeObject.prototype的原型对象是null,也就到头了。

修改原型链

function Person() {}
Person.prototype = [];
var p = new Person();

原型链结构如图所示:

clipboard.png

clipboard.png
[]赋值给了Person的原型对象,所以默认的原型链发生了改变。[]相当于是new Array()
原型链结构:

p -> [] -> Array.prototype -> Object.prototype -> null

总结

如果默认原型链没有被改变,p的原型是Person.prototype,但由于Person.prototype[]赋值了,所以p的原型是[],由于[]相当于是new Array(),所以[]的原型是Array.prototype,从调试界面中得到Array.prototype的原型对象是Object.prototype,最后是null


blob
45 声望2 粉丝

A man who concentrates on coding.