前端面试必考的原型和原型链的详细介绍!!!

144 阅读3分钟

1、原型和原型链的基础理论

01原型和原型链的基础结论

1. 函数与对象的关系

  • 函数是对象,对象都是通过函数创建的。
  • 函数与对象并不是简单的包含与被包含的关系。

2. 原型的类别

  • 显示原型:prototype,是每个函数function独有的属性。
  • 隐式原型:proto,是每个对象都具有的属性。

3. 原型和原型链

  • 原型:一个函数可以看成一个类,原型是所有类都有的一个属性,原型的作用就是给这个类的一个对象都添加一个统一的方法。
  • 原型链:每个对象都有一个_proto_,它指向它的prototype原型对象;它的prototype原型对象又有一个_proto_,指向它的prototype原型对象,就这样层层向上直到最终找到顶级对象Object的prototype,这个查询路径就是原型链。

4. JavaScript里最顶层的两个概念

  • Function是最顶层的构造器

Function是JavaScript里最顶层的构造器,它构造了系统中的所有对象,包括用户定义对象、系统内置对象、甚至包括它自己。

A. 自定义对象

QQ截图20221204232225.png

B.系统内置对象:

QQ截图20221204231554.png

  • Object是最顶层的对象

所有对象都继承Object的原型
Object也是被Function构造出来

QQ截图20221204233104.png

5. instanceof

obj instanceof F
  • 常见的不正确的描述: 用来判断一个对象是否是某个构造函数的实例,比如我们创建一个函数,并且将它实例化

QQ截图20221204234058.png

  • 正确描述: obj.proto.proto... => F.prototype。沿着对象obj的原型链查找是否存在对象F.prototype,若存在则返回true,若查找到原型链的终点Object.prototype仍未找到,则返回false。

02经典的原型和原型链的分析

主要有以下几个类别

QQ截图20221205115321.png

1、函数.prototype

  • 前提结论:

函数都是对象,每个函数都自带有一个属性叫做prototype

  • 例子:

Snipaste_2022-12-05_12-02-56.png

  • 详细结构图:

QQ截图20221205121658.png

  • 最终结论:

每个函数其实有个prototype属性,prototype的属性值是一个对象,这个对象默认的只有一个叫做constructor的属性,指向这个函数本身。

2、对象.proto

  • 前提结论:

每个对象都有一个隐藏的属性叫做_proto_

  • 例子:

Snipaste_2022-12-05_12-26-56.png

Snipaste_2022-12-05_12-28-33.png

  • 解释:

[[Prototype]]:是对象的一个内部属性,chrome的引擎通过_proto_向外暴露了这个属性。实际上它可以看作就是对象的_proto_属性。
_ proto _ 的值:等于构造该对象的函数属性的prototype 属性。testObj.proto === testFn.prototype

  • 结论:

每个对像都有一个_proto_属性,指向创建该对象函数的prototype

  • 详细图:

Snipaste_2022-12-05_12-39-46.png

  • 简化掉细节的通用图:

Snipaste_2022-12-05_12-40-23.png

3、函数.proto

  • 前提结论:

在JavaScript中,函数都是对象,是对象就有隐藏的_proto_属性

  • 解释:

Function是最顶级的构造器,函数对象都是通过它构造的

Snipaste_2022-12-05_12-44-29.png

  • 结论:

函数.proto === Function.prototype

4、函数.prototype.proto

  • 解释:

函数.prototype,它的本质是和 var obj ={}是一样的,由new Object创建的

  • 结论:

函数.prototype.proto === Object.prototype

5、Object.proto

  • 解释:

Object是由顶层构造函数Function构造的

  • 结论:

Object.proto === Function.prototype

6、Object.prototype.proto

  • 结论:

Object.prototype较为特殊,它是顶级对象的原型,所以它的_proto_指向的是null

Snipaste_2022-12-05_12-59-25.png

7、Function.proto

  • 解释:

函数对象都是由被顶级构造函数Funtion创建。所以Function是被自身创建的

  • 结论:

Function.proto === Function.prototype