原型和原型链

195 阅读3分钟

(一)原型

  • 任何一个类(函数)都有原型对象,原型对象至少有两个属性:constructor、proto
    • constructor:指向函数本身
      constructor 属性返回对创建此对象的数组函数的引用。 并不是所有对象都有此属性
    • proto:指向父类原型对象。**
  • 所有的函数数据类型都天生自带一个prototype属性,该属性的属性值是一个对象
  • prototype的属性值中天生自带一个constructor属性,其constructor属性值指向当前原型所属的类
  • 所有的对象数据类型(class),都天生自带一个proto属性,该属性的属性值指向当前实例所属类的原型__.proto.__是存在于实例和函数的原型对象关系
  • 每个构造函数C刚被制造出来的时候,它的c.prototype上面都会有一个constructor属性,并且执行它本身,即c.prototype.constructor === c;

2. 如何理解原型和原型链的?※

把所有的对象共用的属性全部放在堆内存的一个对象(共用属性组成的对象),然后让每一个对象的__proto__ 存储这个*「共用属性组成的对象」的地址*。而这个共用属性就是原型,

原型出现的目的: 就是为了减少不必要的内存消耗

image.png

image.png image.png

(二)原型链

原型链就是对象通过 proto当前实例所属类的原型查找属性或方法的机制,如果找到Object的原型上还是没有找到想要的属性或者是方法则查找结束,最终会返回undefined

image.png

image.png

image.png

[ 问题回顾 ]

1. 什么是原型?什么是原型链?如何理解⭐⭐⭐⭐⭐

构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

(1) 原型:原型分为隐式原型和显式原型,每个对象都有一个隐式原型,它指向自己的构造函数的显式原型。每个构造方法都有一个显式原型。

  • 共用属性组成的对象
  • __proto__是隐式原型;prototype是显式原型
  • 所有实例的__proto__都指向他们构造函数的prototype
  • 所有的prototype都是对象,自然它的__proto__最终指向的是Object()的prototype
  • 所有的构造函数的隐式原型指向的都是Function()的显示原型
  • Object的隐式原型是null

(2) 原型链: 原型链就是对象通过__proto__当前实例所属类的原型上查找属性或方法的机制(就近原则), 如果找到Object的原型上还是没有找到想要的属性或者是方法则查找结束,最终会返回undefined

  • 多个__proto__组成的集合成为原型链(概念类似于作用域链)
  • 如果找到Object的原型上还是没有找到想要的属性或者是方法则查找结束,最终会返回undefined
  • instanceof 就是判断某对象是否位于某构造方法的原型链上。 image.png

2. 构造函数、原型和实例的关系

  • 每个构造函数都有一个原型对象(prototype),
  • 原型有一个属性(constructor)指回构造函数,
  • 而实例有一个内部指针(proto)指向原型。
graph TD
原型 --> 构造函数
构造函数 --> 原型
实例 --> 原型

image.png