函数有三种形态:普通函数、构造函数、函数对象(function foo() {} foo.name = 'tom'; foo['age'] = 20;)
作为构造函数调用的时候:使用new操作符创建对象时,会经历创造出一个新对象、新对象的原型链_proto_指向构造函数的prototype、新对象绑定当前this、执行构造函数、构造函数没有return则返回这个新对象有return且return的是一个对象则返回return后面的对象return后面不是对象则返回这个新对象
只有对象才会有 proto 这个属性,对象.proto -> 上一级构造函数.prototype,以此类推层层往上,就形成了我们所说的原型链
特殊的构造函数: Object 构造函数:Function.prototype.proto === Object.prototype Function 构造函数:Object.proto === Function.prototype