学习原型链笔记

109 阅读2分钟

原型链

在说原型链之前要明确。什么是原型。

原型

首先要明确为什么要有原型对象。

由于JavaScript没有像Java,C++ 实现类继承。在创建对象的时候直接调用类的构造器。

js就通过构造函数来实现创建对象。构造函数来创建对象仍然有一定的问题。

image.png

可以看出使用构造函数创建出来的实例p1、p2的都有一个同名函数sayName,但是这两个sayName并不是同一个function的实例。这就是得每次创建的实例的方法都是重新创建的,并不是共享的。

所以就有了原型,我们将需要的共享的属性方法可以放在prototype对象上就解决了这个问题。

image.png

共享的属性方法直接放在构造函数的原型对象上,Person的所有实例就都可以访问到公共的属性和方法。

构造函数 原型对象 实例对象之间的关系

1.当创建一个构造函数的时,会根据相应的规则创建出一个对应的prototype对象

2.构造函数中会创建一个prototype属性指向prototype对象

3.prototype对象中会创建一个constructor属性指回构造函数

4.创建实例后,实例对象会有一个[[prototype]]属性指向原型对象

三者关系如图所示:

image.png

          图片来自JavaScript高级程序设计

构造函数中的prototype属性指向原型对象,原型对象的constructor属性指回构造函数。

构造函数的实例对象中的[[prototype]]属性指向原型对象。

原型链

有了以上的关系了,就可以实现原型链

当寻找一个对象的属性及方法的时候,首先会在对象本身寻找,如果没有就会去原型上寻找。当我们使用Person的实例对象作为Student函数的原型对象的时候,就会发现着这种链式结构已经产生。

当在实例student1上寻找属性方法时,如果没有就会去原型对象Student Prototype上寻找,如果Student Prototype没有就会继续向原型的原型上(Person Prototype)寻找。

image.png

小结

1.实现原型链的关键就是搞清楚 原型对象 实例对象 构造函数 三者之间的关系。

2.核心时通过使用父级的实例对象作为子级的原型对象这个操作达到链式关系的产生。

第一次写有博客不对的地方 希望大佬指正 共同进步。