原型对象和对象原型以及原型链
首先我们要知道,什么是原型对象,什么又是对象原型?
1.原型就是原型对象------prototype 作用就是:共享方法。
每一个构造函数都有一个prototype属性,指向另一个对象,构造函数通过原型分配的函数是所有对象所共享的。由于在构造函数中定义的方法在创建实例时,都会开辟一个新的内存从而造成内存浪费的问题,这时我们就可以把那些不变的方法直接定义在prototype对象上,这样所有的对象的实例就可以共享这些方法。
2.对象原型__proto__
对象都会有一个__proto__属性,指向构造函数的prototype原型对象,之所以我们对象可以使用原型对象的属性和方法,就是因为对象有__proto__原型的存在。
①实例.__proto__和构造函数.prototype是等价的
②方法的查找规则:首先看实例对象上是否存在这个方法,如果存在就调用实例本身的方法,如果没有就去构造函数原型对象上去查找,如果还是没有就继续向Object.prototype中查找,直到返回null (就近原则)
③__proto__对象原型的意义就在于为对象的查找机制提供一个方向,它是一个非标准属性,因此实际开发中不可以使用这个属性,它只是内部指向原型对象。
除了原型对象和对象原型之外还有一个属性:constructor构造函数
对象原型和构造函数原型对象里面都有一个属性:constructor。我们称为构造函数,因为它指回构造函数本身。
而__proto__原型的constructor也是同样指向的是构造函数,是通过 实例.__proto__ 先指向原型对象然后再 通过 constructor指向构造函数
很多情况下,我们需要手动的利用constructor这个属性指回原来的构造函数,例如,我们修改了原来的原型对象,给原型对象赋值的是一个对象,那么就必须手动的利用constructor指回原来的构造函数。在对象中写:constructor:目标构造函数。
三者的关系图示
构造函数、实例、原型对象三者之间的关系原型链
①只要是对象就有__proto__原型,指向原型对象
②实例的原型对象里面的__proto__原型指向的是Object.prototype
③Object.prototype里面的__proto__原型指向的是null
④由__proto__原型连接而成的'链子'就是原型链
原型链结构