JavaScript每个对象拥有一个原型对象
需要注意的是,只有函数对象才有 prototype
属性
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾
每个实例对象的proto指向它的构造函数的原型对象
person1.__proto__ === Person.prototype
构造函数是一个由Function构造器产生的函数,所以
Person.__proto__ === Function.prototype
同时构造函数的原型对象本身是一个普通对象,所以他的proto指向Object.prototype
Person.prototype.__proto__ === Object.prototype
与此同时,所有的构造器都是函数对象,所以Object
是由Function
构造器产生的
Object.__proto__ === Function.prototype
Function也是一个构造器,所以Function.proto指向自己的原型对象
Function.__proto__ === Function.prototype
Function.prototype.也是一个普通对象,所以它的__proto__指向Object.prototype
Function.prototype.__proto__ === Object.prototype
Object
的原型对象也有__proto__
属性指向null
,null
是原型链的顶端
Object.prototype.__proto__ === null
总结一下:
-
一切对象都是继承自
Object
对象,Object
对象直接继承根源对象null
-
一切的函数对象(包括
Object
对象),都是继承自Function
对象 -
Function
对象的__proto__
会指向自己的原型对象,最终还是继承自Object
对象