构造函数、实例、和原型对象的关系
-
每次创建js函数时,js都会为函数对象默认添加一个称为prototype的额外属性,它指向原型对象,可以用来访问原型对象。
-
然后当我们从Function 对象中创建实例的时候,js引擎会再次向该对象的实例添加_ _proto_ _ 属性。它也可以用于访问Function 对象的同一原型对象。
-
构造函数(Function对象)的原型对象在所有使用该函数创建的实例对象中共享,将方法和属性添加到此原型对象,这些方法和属性将自动用于其构造函数的实例。(在构造函数实例中的__proto__属性中)
-
prototype属性是一个默认情况下 " 拥有constructor属性的对象 " (也就是原型对象)
也可以说函数对象的prototype属性指向的就是原型对象
prototype
指向原型对象(显示原型) constructor指向拥有指向它prototype属性的函数对象
…
实例的原型属性__ proto__
(隐式原型)和函数function的prototype属性指向同一对象(原型对象)。
原型链的定义和继承
对象的原型,也是个对象。只要对象的原型有值,不为null,他就还有原型。所以构成了原型链。
另一种详细理解 : 假如有一个构造函数,然后创建了该构造函数的实例,那么这个被创建出来的函数就会继承构造函数的属性,假如实例的某个属性并未在自身函数内找到,那么它就会往上查找,直到查找到prototype指向null时停止,并返回未声明错误,那么在这个查找的过程层层向上查找的关系就叫做原型链。
总结来说就是:每个被创建的对象都将从其原型链上继承它所寻找到的方法和属性。
可以往原型链上添加属性和方法 ,从而手写原型链继承。
拓展:当一个实例调用某个方法时,它先去自己所属类型的原型链上依次去寻找对应方法,最后才去Object的原型对象