原型链
当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( proto ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节,就是原型链继承。
前言
原型链有个缺点就是:在性能方面,原型链会在查找属性上比较耗时,对性能有副作用,这在性能要求苛刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。因为,在遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。要检查对象是否具有自己定义的属性,而不是其原型链上的某个属性
一、图形描述:
二、图形分析:
原型对象指向构造函数的指针为constructor属性,而构造函数的prototype属性指针指向原型对象,如果构造函数通过new操作符来创建了一个实例对象,那这实例对象可以通过内部指针也就是隐式原型_proto_指向原型对象。_proto_连接的这一系列原型对象就构成了原型链。
构造函数-prototype->原型对象-proto->原型对象-proto-原型对象-proto->…
而由构造函数new出的实例也将由_proto_指向原型对象,相当于父类对子类的一个prototype的指针。
三、属性解释:
prototype: 位于原型链根,每个函数唯一的prototype属性,为显示原型
proto:每个函数实例对象之后都会带有一个_proto_属性,为隐式原型
constructor:prototype原型都会含有一个constructor属性,将指向为它所关联的构造函数
原型链总结:
原型链:获取对象属性时如果本身对象并没有该属性,那将会去他的原型实例_proto_上去找,依次遍历整条原型对象,原型对象->原型对象->…->object.prototype为止。
如果中间找到会停止查找返回该方法。如果一直没找到会返回未定义。
没找到返回为null,因为object.prototype对象也有一个_proto_属性,值为null。