原型与原型链
原型
- 每个函数都有一个特殊的属性叫作原型(
prototype
) - 每个实例对象(
object
)都有一个私有属性(称之为__proto__
)指向它的原型对象(prototype
) - 该原型对象也有一个自己的原型对象(
__proto__
) ,层层向上直到一个对象的原型对象为null
。根据定义,null
没有原型,并作为这个原型链中的最后一个环节。
构造函数,原型和实例三者之间的关系
function Father(){};
var f = new Father();
Father.prototype === f.__proto__ //true
Father.prototype.constructor === Father //true
原型链
- 原型链的最顶端是
null
- 所有的原型的
_proto_
都是Object的原型 - 所有的构造函数的
_proto_
都是Function的原型 - Function的
_proto_
和prototype
都是Function的原型
Object.prototype.__proto__ //null 1
Function.prototype === Function.__proto__ //true 4
Object.__proto__.__proto__ === Object.prototype //true
Function.__proto__.__proto__ === Object.prototype //true
function Father(){}
Father.__proto__ === Function.prototype //true 3
Father.prototype.__proto__ === Object.prototype //true 2
String.__proto__ === Function.prototype //true 3
String.prototype.__proto__ === Object.prototype //true 2
后记
理解,每个函数(构造函数,或者普通函数)都有一个属性叫做原型(prototype),
每个实例对象都有一个私有属性(__proto__
),每个实例对象之间的__proto__
指向就是原型链。
最后贴一张更全的图