一文搞定Javascript中的原型与原型链

Dec 23, 2021|Oct 23, 2023
Asuhe
Asuhe
type
status
date
slug
summary
tags
category
icon
password

终极原型链

只要对js深入了解一些,你肯定听说过一句话就是函数本质上也是一个对象,当函数被当作做对象去使用时函数就被称为函数对象,当函数被()调用是一个函数。既然函数也是对象,那它肯定也有一个原型。本文讲解将一直以下面代码为例
所有的函数对象都会有一个原型(ES6箭头函数除外),且会有一个prototype属性指向该原型。当用一个函数对象当作构造函数使用new创建一个实例对象时,该构造函数所有实例对象的隐式原型即__proto__都会指向构造函数的原型对象。在上述代码中我们可以得到一个最基本的原型链结构
notion image
原型链(1)
函数对象的原型本质上也是一个对象,只要是对象那么必定会有一个构造函数。实际上除函数对象和自身指定构造函数的对象外,所有的对象都是由Object这个构造函数new出来的。也就是说函数对象的原型是由Object构造出来的。根据原型链查找规则,我们可以用如下代码证明
notion image
原型链(1)
Object作为构造函数那么它必然也有一个原型并且由prototype属性指向。上面我们说过除函数对象和自己指定构造的对象外,所有的对象都是由Object作为构造函数new出来的。所以我们可以画出更加完善一点的原型链
notion image
原型链(2)
Object的原型的隐式原型__proto__应该指向其构造函数的原型prototype,而Object的原型是由它自身new出来的。这样它原型链就形成了一个环:Object.prototype(prototype of Object).__proto__Object.prototype。为了阻止原型链在这个环里无限循环查找下去,所以在底层(prototype of Object).__proto__被设置成了null。我们可以用代码证明上述的原型链
notion image
输出

函数对象的原型链

到目前为止,我们基本搞定了普通对象的原型链结构。但是还有一个问题我们没有搞定就是,既然函数也是一个对象那么它肯定也有自己的隐式原型__proto__指向它的构造函数的原型。在js的底层所有的函数都是由Function作为构造函数new出来的,也就是说任何一个函数都是Function的实例
当我们使用function关键字时本质上就是Fuction作为构造函数new了一个对象。在js的底层最终都是调用Function函数去创建一个函数的。我们可以使用如下代码证明
notion image
输出
Function函数本身也是一个函数对象,但是Function它是由自己new出来的。所以它的__proto__prototype都指向同一个原型。
有了以上基础我们就可以继续完善一下原型链
notion image
原型链(3)
上面这个图就是我们常说的终极原型链了

自测题

DOM渲染原理前端工程中的模块化&组件化