原型和原型链
1. prototype
在JavaScript中,每一个函数对象都有一个 prototype 属性(引用变量属性),该属性指向指向一个空的Object对象,该对象叫做原型对象
function Person(){}
Person.prototype.name = "protoName"
var person = new Person()
console.log(person.name)
person由于本身没用name这个属性,所以他会去构造函数Person找,而Person函数本身也没有name属性,所以会去Person.prototype上面找,也就是去Person的原型上面找,这就是最基本的原型链了

2. proto
每一个对象都有一个__proto__属性,他指向该对象的原型
function Person(){}
var person = new Person()
console.log(person.__proto__ === Person.prototype)

3. constructor
每个原型都有一个constructor属性(也就是说,constructor是存在于prototype上面的属性),指向该关联的构造函数。
function Person(){}
var person = new Person()
console.log(Person.prototype.constructor === Person)
console.log(Person.prototype.constructor === person.constructor)

4. 原型的原型
原型本质也是一个对象,那么对象就可以通过 new Object() 构建 那么也就是说,原型的__proto__属性指向原型的原型,也就是 Object.prototype 
4. 整个原型链图
var fn = new Fun();
console.log(fn.__proto__ === Fun.prototype)
console.log(Object.prototype === Fun.prototype.__proto__)
console.log(Object.prototype === fn.__proto__.__proto__)
console.log(fn.__proto__.__proto__.__proto__)
console.log(Function.prototype.__proto__ === Object.prototype)
console.log(Fun.__proto__ === Function.__proto__)

|