JS--显式原型与隐式原型

1,531 阅读1分钟

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()产生的(包括ObjectFunction)。所以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