- 首先了解一下什么是原型?
在构造函数创建的时候, 系统默认的帮构造函数创建并关联一个对象 这个对象就是构造函数的原型对象
- 原型的作用
在原型中的所有属性和方法, 都可以被和其关联的构造函数创建出来的所有的实例对象共享
- 如何访问原型
构造函数本身可以通过 构造函数名. prototype
实例对象可以通过 实例化的对象.__proto __
了解了原型后,我们再来看一下构造函数和原型对象上的几个方法
1. prototype
含义: 是一个函数的属性, 这个属性是一个指针, 指向一个对象
作用: 构造函数调用可访问该构造函数所关联的原型对象
2. proto
含义: 是一个对象拥有的内置属性, 是 JS 内部使用寻找原型链的属性, 通过该属性可以允许实例对象直接访问到原型
3. constructor
含义: 原型对象的 constructor 指向其构造函数, 如果替换了原型对象之后, 这个 constructor 属性就不准确, 需要手动补充一下
下面我们结和这个图来了解一下
大致的先浏览一下上面的图片,我们看到这里,先了解一下,
new一个实例对象的过程:
- 内存中创建一个空对象
- 这个空对象的proto成员指向了构造函数对象prototype成员对象
- 构造函数对象的this指针替换成空对象,然后再调用构造函数,于是构造的this就指向了新的空对象,并且会往实例化对象身上挂载方法
- 最后通过构造函数返回这个实例化对象
构造函数、原型和实例的关系:每个构造函数都有一个prototype指向原型对象,原型对象有一个constructor属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例呢?那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。这就是原型链的基本构想。
1.构造函数的prototype属性指向了构造函数原型对象
2.实例对象是由构造函数new出来的,实例对象的__proto__属性指向了构造函数的原型对象
3.构造函数的原型对象的constructor属性指向了构造函数,实例对象的原型的constructor属性也指向了构造函数
这就是构造函数实例和原型对象三角关系,也就是上图的最下方的那个三角区域
每个new出来的实例对象有一个__proto__属性,指向的构造函数的原型对象,构造函数的原型对象也是一个对象,也有__proto__属性,这样一层一层往上找就形成了原型链
总结:
- 当一个对象访问属性和方法的时候,他的访问规则叫(就近原则) , 规则如下:当实例上面,存在属性或者方法时,直接用实例上面的,如果实例上面不存在属性和方法,就会沿着实例的__proto__指针指向的原型对象继续往上查找,如果找不到,值就是null。
- 每个函数都有
prototype属性,会指向函数的原型对象。 - 所有函数的原型对象的
__proto__,会指向Object.prototype。 - 原型链的尽头是
Object.prototype.__proto__,为null。