从一个例子理清JS中的prototype、__proto__、constructor及Object、Function的关系:
function Animal(){}
var anim = new Animal()
1. new出来的对象是普通对象,有__proto__属性,但没有prototype属性
2. anim的__proto__属性,指向它的类型Animal的prototype对象
3. Animal是函数对象(function Animal(){}相当于var Animal = new Function()),它有prototype、__proto__属性
4. Animal的__proto__属性指向它的类型Function的prototype对象
5. Animal的prototype(属性指向的)对象(普通对象),包含__proto__、constructor属性,其中constructor即其本身Animal,__proto__指向Object.prototype
6. Function自身是一个函数对象,其prototype和__proto__属性相等,都指向一个函数对象;但这个函数对象比较特殊,它没有prototype属性,其同样包含__proto__、constructor属性。其中constructor即其本身Function,__proto__指向Object.prototype
7. Object自身也是一个函数对象,其__proto__属性指向它的类型Function的prototype属性;它的prototype对象是一个普通对象,其中constructor即其本身Object,__proto__比较特殊是null