mx52jing/blog

原型和原型链

Opened this issue · 0 comments

prototype

提起prototype都不陌生,当创建一个函数时,新创建的函数都会有一个prototype属性,而这个prototype的值是一个对象,默认有一个一个constructor属性,指向函数本身

image

那么prototype又指向什么呢

prototype指向调用该函数生成的实例的原型

__proto__

提起原型,就要引出 __proto__(隐式原型),__proto__是对象的私有属性,一般不建议直接修改

image

constructor

刚刚提起过,每个函数的prototype属性是一个对象,这个对象默认有一个constructor指向函数本身

来一张图展示一下构造函数、实例原型、和实例化对象的关系

image

实例和原型

当访问实例上的属性时,如果实例中没有该属性,就会在实例的原型中寻找,如果实例中含有该属性,就不会再去原型中寻找,如果实例的原型中没有,就会到实例的原型的原型中寻找,以此类推。。。

function Foo(){}
Foo.prototype.book= "水浒传"

var foo = new Foo()

foo.name // 水浒传

foo.name="西游记"

foo.name // 西游记 ( 实例中有该属性,就不去原型中寻找)

原型链

上面说到,当访问一个对象的属性时,会现在对象的实例中寻找,如果实例中没有这个属性,就会到对象的原型中去找,如果对象的原型中也没有,就会到对象的原型的原型的原型中去找,以此类推,但是寻找路线总会有一个终点,这个终点就是Object.prototype,查找到Object.prototype就不会查找,那为什么不会查找Object.prototype.__proto__呢,其实 Object.prototype.__proto__ = null,null表示已经没有了。
而通过一连串查找组成的链状结构就是原型链(蓝色线条所组成的链条)。

image