原型和原型链
Opened this issue · 0 comments
mx52jing commented
prototype
提起prototype都不陌生,当创建一个函数时,新创建的函数都会有一个prototype属性,而这个prototype的值是一个对象,默认有一个一个constructor属性,指向函数本身
那么prototype又指向什么呢
prototype指向调用该函数生成的实例的原型
__proto__
提起原型,就要引出 __proto__(隐式原型),__proto__是对象的私有属性,一般不建议直接修改
constructor
刚刚提起过,每个函数的prototype属性是一个对象,这个对象默认有一个constructor指向函数本身
来一张图展示一下构造函数、实例原型、和实例化对象的关系
实例和原型
当访问实例上的属性时,如果实例中没有该属性,就会在实例的原型中寻找,如果实例中含有该属性,就不会再去原型中寻找,如果实例的原型中没有,就会到实例的原型的原型中寻找,以此类推。。。
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表示已经没有了。
而通过一连串查找组成的链状结构就是原型链(蓝色线条所组成的链条)。