什么事原型
原型(prototype)是所有对象都有的一种属性,是对象生成时自带的。里面封装的时很多方法,也都是在对象生成时自带的。
原型有什么用
在讲原型有什么用之前,首先要知道,代码中所有的对象都是由谁构建的,因为原型在对象中存在着继承机制
对象都是由谁构建的
通常构建一个对象的方法就是var一个变量名,然后给他赋上值就可以了。就比如:
var a = {}
不知道读者有没有听过一种说法:“对象都是new出来的”。
那么这样一看,这句话又不对。因为我上面没有用new这个关键字啊
其实这样是一种简便的写法,其真正的写法应是这样的:
var a = new Object()
Object就是内置构造函数。这样一看,“对象都是new出来的”这句话就对了。哈哈哈哈哈哈
好,现在问题又来了,Object既然是一个构造函数,那么他就一定是个对象(函数都是对象)。那么Object也应该是new出来的,那么他是谁new出来的呢?
这里就准根溯源到最初了,有一个祖宗级别的函数,叫 Function,可以说,所有的函数都是他的直系血脉。
好,那你是不是又要问,这个老祖宗又是谁new出来的。
没有了,这就是最初的
Function这个函数是Js引擎生成的,再没有爸爸爷爷之类的关系了。
这里就要放一张经典的图
我知道你看不懂
没关系,我也不是太懂,但是比你懂一些
接下来讲这个原型的继承
原型的意义
我们从上面得知,原型是在函数生成时自带的一种属性,里面封装着很多方法。其实这些方法,都是由创建他们的函数继承给他们的,也就是我在new一个对象时,构造函数把原型里的方法也给了他,这样就能让对象继承很多方法,不至于再一一创建,方便了很多。
那么我能不能通过new出来的对象的原型,往回找到我的构造函数的原型呢?这样我在不知道函数是谁创建的时,我就能通过原型找到了呀。
可以的。
对象再被构建时,不仅自带了prototype这一种属性,同时还生成了另一种属性叫:
隐式原型(__proto__)
隐式原型只有一个作用,就是找到构建我函数的构造函数的原型
知道这点后再看上面的图,是不是就能理清他们之间的联系了
为什么Function的原型和隐式原型都是一个东西?
为什么Function的隐式原型是Object的原型?关系不对啊?
别问,问就是不知道。人家原理就是这样,理解不了就强记呗,没办法
原型链
由所有原型连接起来的一个链条,就叫原型链
就这么简单