原型与原型链是什么?
(1)原型是什么?
原型是一个对象。每一个JavaScript对象(null除外)在创建的时候都会关联另一个对象,这个对象就是我们所说的原型。
怎么解释呢?
首先假设一个构造函数Person,用new创建一个实例对象person1.
然后已知每个函数都会有一个属性叫做prototype,属性prototype指向的是一个对象,这个对象也就是调用构造函数Person时创建的实例的原型。
所以构造函数与实例原型通过prototype属性联系在一起
构造函数Person,实例原型Person.prototype 通过属性prototype联系
除此之外,每一个javaScript对象(null除外)都有一个属性叫做_proto_ ,
然后javaScript对象通过属性_proto_与原型联系,这个属性指向对象的原型
也就是说 实例对象person1通过属性_proto_与实例原型Person.prototype
(2)原型是怎么创建的?
原型是对象,既然是对象,那么我们就可以用构造函数Object()来创建。
所以Person.prototype就是构造函数Object()创建出来的实例对象,所以构造函数Object的属性prototype会指向Object.prototype. 然后实例对象Person.prototype通过属性_proto_指向其原型对象Object.prototype.
Object.prototype也是对象,那它的原型呢?是null
一般在查找属性的时候,查到Object.prototype就可以不找了。
(3)原型链是什么?
就是说当读取实例对象的属性的时候,如果在实例中找不到这个属性,就会查找与这个实例关联的原型里的属性。如果还找不到,就通过_proto_去找原型的原型,直到找到最顶层为止。最终是null。这样,由原型通过属性_proto_组成的链状结构就叫做原型链。
(4)使用原型有什么好处?
通过使用原型,可以避免在每个实例里定义相同的属性和方法,从而节省内存。