一、prototype 显式原型

所有Function的实例都是函数对象,而其他的都称之为普通对象。
**
在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。有以下这些特性:

  1. 原型(prototype)是所有函数的属性,并不只是构造函数所特有
  2. 在创建任何一个函数时,prototype就已经作为这个函数的属性被引擎自动创建了

    注:此处有一个例外,为Function.prototype。它的typeof为functon,然而它没有prototype属性

  3. prototype属性值为一个对象,因此我们也称prototype为原型对象


原型的概念**:每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。
让我们用一张图表示构造函数和实例原型之间的关系:
原型与原型链 - 图1

二、proto 隐式原型

prototype是函数对象所特有的,而proto是所有对象(除null外)都有的。

下面这张图具体的介绍了他们直接的关系
原型与原型链 - 图2

三、原型链

当我们 调用 对象中某个 属性或方法 时,如果在 当前对象中找不到目标属性或者方法 ,则会去当前对象 __proto__ 指向的原型对象 中寻找。如果原型对象中依然没有,则到 原型对象 的 __proto__ 指向的对象原型里面找,直到找到为止 ,如果在 最顶层对象中仍然没有找到 ,就结束查找,返回 undefined
原型与原型链 - 图3
对象的原型proto指向其构造函数的prototype属性,而构造函数的prototype也有自己的原型,沿着原型链一直向上回溯,直到找到Object.prototype,而Object.prototype没有原型了,其proto为null,因此其为原型链的终点。