原型的基本概念:
每个实例对象都有一个私有属性[[Prototype]](谷歌、火狐浏览器中实现为__proto__)指向创建他的构建函数的原型对象prototype。__proto__我们称之为隐式原型,prototype为显式原型。
接下来我们在控制台中看看原型的指向。
在控制台中我们创建一个对象,并且打印出来这个对象

可以看到我们创建的这个对象除了创建时设置的一个属性a,还有个自带的属性__proto__。
接下来看__proto__的指向,由概念我们得出,obj的__proto__指向的是创建obj的对象的prototype。而var obj = {a:1};是var obj = new Object({a:1});的简写。
接下来我们验证一下
我们在Object的原型对象上创建一个属性b,通过控制台打印obj,obj的__proto__指向创建他的构造函数Object的prototype对象。

接下来我们看Object的prototype对象。
prototype对象中有一个属性constructor指向的是Object()自身,他是一个构造函数。
构造函数Object()也是一个对象,所以他也有自身的__proto__指向的是创建他的构造函数的prototype对象。

由图可见,Object()的__proto__指向的是Function()的prototype对象。(prototype的constructor属性指向的是构造函数)
顺着一步步的指向,现在找到了Function上,接下来看看Function最为一个对象的__proto__指向。

可以看到Function的__proto__指向的是创建他的构造函数的原型,也就是Function函数。
而Function的prototype对象作为一个对象,他的__proto__指向的是Object对象的prototype属性。

Object.prototype对象的隐式原型__proto__指向的是null,作为一个闭环。
总结:
通过__proto__一步一步向上找形成的链,我们称之为原型链。
instanceof 这个方法就是通过原型链来查找两个对象是否相同。
例:

我们接着用这个示例来看一下原型链

通过打印son来看隐式原型__proto__的指向,son的隐式原型__proto__指向的是创建他的构造函数的Parent的prototype,而Parent的原型对象prototype的隐式原型__proto__指向的是Object的显式原型prototype(我们在上面给Object的prototype设置过一个属性b=1),Object的prototype的隐式原型__proto__指向的是null,作为原型链的终点。