1.什么是原型链?
你可以将它想象成一个链条,连接着实例对象和原型对象。每个函数都有一个prototype属性,
这就是我们所说的原型对象。如果这个函数用new 构建出了一个实例对象,这个实例对象会有
一个__proto__指针指向他的构造函数的原型对象,这样构造函数和实例对象之间就通过
(__proto__)连接在一起,形成了一个链子。
原型链的作用
JS有一个原型查找机制,把原来定义在实例上的方法,放到原型对象上去,通过构造函数的new操作,会把原型对
象赋值给实例的__proto__属性,那么当使用返回的实例去调用某一个方法的时候,如果实例本身上没有,就去自
动去实例的__proto__上去查找,这样达到方法的复用,减少内存开销。
prototype 和 proto
-
prototype
显式原型,是构造函数的原型对象,函数的独有属性 -
proto
是实例对象指向原型对象的指针,隐式原型,是每一个对象都有的属性 -
示例
由上面的示例可知,构造函数和prototype对象,__proto__指针是有关联的,在实例对象中用__proto__指针调
用方法,而在原型对象中则用prototype ,这两种相等,则说明原型链将被 __proto__ 指针连接起来。
-
constructor
原型对象中,还有一个指向函数的 constructor 属性
每个函数都有一个原型对象,该原型对象有一个constructor属性,指向创建对象的函数本身。
所有的实例对象都可以访问 constructor 属性 , 可以使用 constructor 属性来判断是否在一个原型链上
示例
两者的 constructor 值相等,说明他们在同一个原型链上
结论
1.实例化对象中查询使用__proto__ 指针 ,它指向prototype 对象
2.prototype 是函数独有的属性,定义构造函数时自动被创建,可以给函数和对象添加可共享的(继承的)方法和属性
3.constructor 属性能使原型对象和实例对象找到其创建他们的构造函数。