前言

回顾一下,上一篇文章主要通过构造函数与其实例对象讲解了原型对象、构造函数和隐式原型链之间的关系及用法,希望没看过的同学去先去看看第一篇再来。

这一篇我们主要是来完整的学习下原型链。

首先需要了解的

  • __proto__和constructor属性是一般对象所独有的
  • 函数也是一种对象,且独有prototype属性
  • null和undefined不属于一般对象

1.构造函数与实例对象之间的原型链

function Person () {}
let person1 = new Person()

以上代码大家应该很熟悉了,尤其再配上下面这张图。

原型链指的是对象在获取其属性时,首先会查找它自身的属性,如果找不到,会沿着原型链一级一级向上查找属性,如果找到会停止向上查找并返回属性值,如果找不到则返回undefined。以上图例中,绿色的那一条线就是原型链。

2.函数的原型链

(1).描述

  • 所有函数的构造函数都是Function(Function函数的构造函数也是它本身Function)
  • 相对应的函数隐式原型链的上一级都是Function.prototype,再往上是Object.prototype,最上一级指向null

(2).图解

foo为自定义函数,其余ObjectFunctionSymbol等函数为js中原生构造函数。以下蓝色线条都为函数的隐式原型链。

(3).结论

一个函数的隐式原型链指向如下

3.对象的原型链

(1).基础回顾

在javascript入门时相信大家都了解过js的几种基本数据类型。加上es6之后加上的SymbolBigInt一种八种。

  • Boolean
  • Null
  • Undefined
  • Number
  • BigInt
  • String
  • Symbol
  • Object

(2)非一般对象

这个非一般对象是我自己起的名