明确一些概念
- JS 万物皆对象,函数也是对象,所以函数可以拥有属性。
- 所有对象都是通过 new 函数 创建的。
- 所有的对象都是引用类型。
- 原型对象就是一个普通的 Object 对象。
- 构造函数具有二义性,可以当做函数,也可以看作是实例对象。
基础原型链的三角结构
function Student() {}
let stu = new Student();
几条原则:
- 所有的实例对象都有一个属性
__proto__, 他指向函数原型。 - 所有的构造函数都有一个属性
prototype, 他指向函数原型。 - 所有的函数原型都有一个属性
constructor, 他指向构造函数。
完整的原型链
几条原则:
Object的函数原型与Function的构造函数是 JS 引擎启动时就初始化完成的。Object的函数原型是所有对象的原型链终点。Function的构造函数负责创建所有函数对象,包括自身和Object的构造函数。- 绿色线条为 JS 规定:
Function构造函数的__proto__指向其函数原型。