原型链的认识
- 既然提到原型链,就需要和构造函数联系起来进行理解;
构造函数的认识
其实构造函数时函数调用的一种模式,例如创建了一个函数,然后通过一个变量new了这个函数,那么这个函数就可以成为构造函数,可以从作用上来理解它为什么叫构造函数,直白点可以说是来构造一个对象出来的,实际上是实例化了一个对象出来,任何通过new来进行操作的函数都可以成为构造函数。
接下来那么这个被new出来的对象就会继承创建出来的那个函数的属性,前提是在构造函数内部通过this.属性名
这样的属性new出来的实例对象才能拥有。
引出原型链的认识
当new出的这个实例对象需要访问某个属性时,首先它会在其本身查找,也可以理解为是先看其构造函数内部有没有通过this.属性名
初始化这个属性,如果没有找到这个属性,也就是没有从本身找到这个属性,那么它就会往上查找,这个查找过程中查的那条链就叫做原型链,具体了解可以看引申出来属性搜索原则,下面有总结,其实这也和原型继承这个机制是联系在一起的,可以说设计这个原型链就是为原型继承服务的;
构造函数的整个过程:
- 1、new申请内存,创建对象,(new运算符可以称作新建运算符);
- 2、调用构造函数,构造函数有一个隐式参数,即this;
- 3、刚创建出来的对象的引用赋值给this,由函数处理;(其实主要就是利用new能够动态改变this的指向)
- 4、在构造函数中利用this.成员 = 值来给对象添加成员
构造函数的优势:
- ①、对象就有独立的原型对象;
- ②、也具有类型名了
属性搜索原则
- ①、在当前对象中找;
- ②、在构造函数定义规则中找;
- ③、在其原型对象中找;
- ④、在其原型对象的原型对象中找…….直到Object.prototype,这等于就是在其原型链上寻找
- ⑤、如果没有则返回undefined;
稍微深入的理解下原型
其实对象中有一个属性 叫 proto
通过调试可以发现 对象的 proto 与创建(实例化)它的构造函数的 prototype 是一个东西
看下面的代码测试:
1 | function F() { //声明一个构造函数 |
注意一下 proto 是非标准属性,这里也只是辅助理解来运用下,实际工作中不要采用它来进行业务逻辑
原型对象与原型属性
F.prototype
是构造函数 F 的原型属性F.prototype
是对象 o 的原型对象
_proto_与prototype有什么区别
_proto_
是站在对象的角度讨论其原型对象prototype
是站在构造函数的角度讨论其原型属性,或构造函数创建的对象的原型对象
也可以理解成所站的位置不同,就会有不同的角色。
上面的这些理论知识还是会有些抽象,抽时间我会把原型链画一下,那样理解起来就清晰了。