1、每个函数都有显式原型属性,即prototype,默认指向一个空的Object对象(但Object的prototype不是一个空的Object对象)
function Fn(){
//内部语句 this.prototype = {}
}
var Fn = new Function()
Fn 也是 Function的实例对象,所以Fn也有自己的隐式原型,且 Fn.__proto__ === Function.prototype
var Function = new Function() //左边的Function是一个通过Function()new出来的实例对象
Function.__proto__ === Function.prototype
所有(构造)函数的__proto__的值都是Function.prototype, 因为所有的函数都是通过 new Function()产生的(包括Object和Function)。所以Object.__proto__ === Function.prototype
2、每个实例对象都有隐式原型属性,即__proto__,值为对应的构造函数的显式原型的值
实例对象的隐式原型 === 构造函数的显式原型
var fn = new Fn() //内部语句:this.__proto__ = Fn.prototype
即: fn.__proto__ === Fn.prototype
Object构造函数的显式原型对象的隐式原型值为null
即: Object.prototype.__proto__ === null
3、(隐式)原型链
访问一个对象的属性时,先在自身属性上找,找到返回。
如果没有,就沿着__proto__这条链向上找,找到返回。
如果最终没有找到,返回undefined
原型链的尽头就是Object的原型对象。Object.prototype.proto === null