面向对象之原型链

原型链的认识

  • 既然提到原型链,就需要和构造函数联系起来进行理解;

构造函数的认识

    其实构造函数时函数调用的一种模式,例如创建了一个函数,然后通过一个变量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
2
3
4
5
6
function F() { //声明一个构造函数

}
var o = new F(); //通过这个构造函数实例化一个对象o

console.log( o.__proto__ === F.prototype ); //true

注意一下 proto 是非标准属性,这里也只是辅助理解来运用下,实际工作中不要采用它来进行业务逻辑

原型对象与原型属性

F.prototype 是构造函数 F 的原型属性
F.prototype 是对象 o 的原型对象

_proto_与prototype有什么区别

_proto_是站在对象的角度讨论其原型对象
prototype是站在构造函数的角度讨论其原型属性,或构造函数创建的对象的原型对象
也可以理解成所站的位置不同,就会有不同的角色。

上面的这些理论知识还是会有些抽象,抽时间我会把原型链画一下,那样理解起来就清晰了。