默认原型链
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
,也就到头了。
修改原型链
function Person() {}
Person.prototype = [];
var p = new Person();
原型链结构如图所示:
[]
赋值给了Person
的原型对象,所以默认的原型链发生了改变。[]
相当于是new Array()
原型链结构:
p -> [] -> Array.prototype -> Object.prototype -> null
总结
如果默认原型链没有被改变,p
的原型是Person.prototype
,但由于Person.prototype
被[]
赋值了,所以p
的原型是[]
,由于[]
相当于是new Array()
,所以[]
的原型是Array.prototype
,从调试界面中得到Array.prototype
的原型对象是Object.prototype
,最后是null
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。