什么是原型

JS声明构造函数(用来实例化对象的函数)时,会在内存中创建一个对应的对象,这个对象就是原函数的原型

通俗的来说原型就是一个可以被复制/克隆的类,通过复制原型可以获得一模一样的新对象,那么也可以说原型是一种模板。

特性:

  1. 原型创造出来的新对象实例会共享原型的所有属性和方法

  2. 所有函数都有一个prototype(原型)属性,属性值指向原型对象

  3. 实例对象的__proto__指向构造函数的prototype

什么是原型链

image-20230428223917997

​ 每个对象拥有一个原型对象,通过proto指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层往上,最终指向null(Object.prototype.__proto__)。这种关系被称为原型链,通过原型链一个对象可以拥有其他对象中的属性和方法。

原型链的尽头:

image-20230428223706173

从上图可以看出原型链的尽头是Object,而Object.prototype.__proto__的值是null

prototype和 proto的区别

  1. prototype是构造函数的属性
  2. __proto__是每个实例都有的属性,可以访问[[prototype]]属性
  3. 实例的__proto__与其构造函数的prototype指向的是同一个对象

原型和原型链的区别

原型是为了实现对象间的联系,解决构造函数无法数据共享而引入的一个属性,而原型链是一个实现对象间联系即继承的主要方法

参考文章:

一文搞懂JS原型与原型链(超详细,建议收藏) - 掘金 (juejin.cn)

什么是原型、原型链?原型和原型链的作用

[JS]深入理解原型和原型链以及区别(包含面试题详解) - 掘金 (juejin.cn)