再讲js之前,必须先了解Object和Function。
Object和Function都作为JS的自带函数,Object继承自己,Function继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。
普通对象和函数对象
JavaScript中万物皆对象,但是对象之间是有区别的,分为函数对象和普通对象
凡是通过new Function创建的对象但是函数对象,其他都是普通对象(通常都是Object创建的)
原型(prototype)
每个函数都有一个属性prototype。这个prototype的属性值是一个对象(属性的集合),它默认只有一个叫做constructor的属性,它指向这个函数的本身。
SuperType是一个函数,右侧的方框就是他的原型
原型(prototype)既然作为对象,除了constructor外,还可以自定义许多属性:
rototype原型只能通过函数调用,自定义函数的原型指向它自己(对象没有原型)
constructor(构造器)(在原型对象中)
在JavaScript中,每个具有原型的对象都会自动获得得constructor属性。除了
arguments、Enumerator、Error、Global、Math、RegExp等一些特殊对象之外,其他所有的JavaScript内置对象都具备constructor属性。例如:Array、Boolean、Date、Function、Number、Object
constructor返回创建实例对象时构造函数的引用。此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串
隐式原型(__proto__)
每个JavaScript对象(除了null)都具备隐式原型(_proto_)这是一个访问器(即getter函数和setter函数),通过它可以访问到对象的内部[prototype](一个对象或null)
原型链
因为每个对象和原型(prototype)都有隐式原型,对象的隐式原型指向创建该对象的构造函数的原型对象,而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。
蓝色的线就是原型链。null 表示“没有对象”,即该处不应该有值。这句话也意味着 Object.prototype 没有原型
附上一张全解图:
总结:
Function的原型和隐式原型都指向它自己
自定义函数的隐式原型指向上一级的原型,最终都指向Function.prototype
构造函数的隐式原型最终都指向Object.portotype