原型链

默认原型链

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,也就到头了。spa

修改原型链

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

原型链结构如图所示:prototype

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,最后是nullcode

相关文章
相关标签/搜索