一文搞懂构造函数原型和原型链

105 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

前言

javascript 中与函数相关的概念有很多,构造函数,原型和原型链也是前端高频面试题之一,相信前端的小伙伴们都有遇到过这个问题,今天就和大家一起来彻底搞懂函数原型相关的知识

什么是构造函数

2022-12-08 22 13 05

提到构造函数,首先还要提到对象Object的概念,js 中创造对象的方法有很多,但其根本上都是利用构造函数constructor作为对象的模板,来生成对象的实例,例如:

function Person(name) {
    this.name = name
}
const man = new Person('小明')
// man { name: '小明' }

简单总结,构造函数(本身也是对象)就是用来生成对象的,并且所有的对象都是new 函数创造的

2022-12-09 22 22 32

可以看到所有对象都是由 Function 为源头创造,可能有同学会有疑问,Function 本身也是对象,那它是由谁创造的呢?

Function比较特殊,它是直接放在内存中的,JS引擎初始化的时候就会生成一个Function 对象,不通过任何东西来创建,而其他所有对象,都是通过new来创建的

typeof Object // function
typeof Array // function
typeof Person // function

什么是函数原型

所有函数都有一个属性: prototype,称为函数原型

2022-12-09 22 43 07

prototype 是哪里来的

所有对象都是通过new生成的,函数也不例外,在new Function 时,会给函数对象添加一个prototype属性,

它是一个普通对象,上面还有一个属性 constructor,它也是一个对象,并且指向构造函数本身

2022-12-09 23 12 59

Person.prototype.constructor === Person  // true
Object.prototype.constructor === Object  // true

隐式原型__proto__

所有的对象都有一个属性: __proto__,称之为隐式原型(带下划线的都为系统变量,不要轻易修改)

2022-12-09 23 26 36

默认情况下,隐式原型指向创建该对象的函数的原型

const obj = {}
obj.__proto__ === Object.constructor // true

2022-12-10 11 19 36

小结

  • 函数拥有:prototype —— 显示原型
  • 对象拥有:__proto__——隐式原型

原型可以解决什么问题

原型最大的作用就是用来共享对象的属性和方法

什么是原型链

简单说我们把原型之间串联的关联关系,称为原型链,原型链最顶端是 null

查找顺序

对象本身 =》构造函数中查找 =》对象的原型 / 构造函数的原型 =》 当前原型的原型中查找