原型与原型链是javascript里面最最核心的内容,如果不能理解它们之间的存在关系的话,那么我们是不能理解这门语言的。
在JS中,主要有两种创建对象的方法, 分别是对象字面量以及调用构造函数
| 1 | //对象字面量 | 
其实上述两种创建对象的方法,本质上是一样的,都是JS引擎调用对象的构造函数来新建出一个对象。构造函数本身也是一个普通的JS函数
下面我们来看一个例子
| 1 | //创建构造函数 | 
我们借助上面的例子来理解构造函数-原型-实例,三者之间的关系,主要有几个基本概念
- 构造函数默认会有一个protoype属性指向它的原型
- 构造函数的原型会有一个consctructor的属性指向构造函数本身, 即1 Person.prototype.constructor === Person 
- 每一个new出来的实例都有一个隐式的__proto__属性,指向它们的构造函数的原型,即1 
 2person1.__proto__ === Person.prototype 
 person1.__proto__.constructor === Person
了解了这些基本概念之后,我们再来看看javascript的一些原生构造函数的关系网,看下列的图
按照我们上面的理解, Oject本身是一个构造函数,它也是一个对象,那么
    1
Object.__proto__ === Function.prototype
为了方便我们记住上图,还有几个需要我们知道的特殊概念:
- Function的原型属性与- Function的原型指向同一个对象. 即是- 1 - Function.__proto__ == Function.prototype 
- Object.prototype.__proto__ === null
- typeof Function.prototype === 'function'
参考
[在JavaScript中,Function构造函数本身也算是Function类型的实例吗?][https://www.zhihu.com/question/31333084/answer/152086175]
