原型链

prototype

每一个函数都有一个 prototype 属性,指向了实例的原型(__proto__)

__proto__

每一个 js 对象(除了 null )都有一个属性 __proto__,指向对象的原型,即函数的 prototype

每个原型都有一个 constructor 属性指向关联的构造函数

如何模拟 new 的创建

  1. 创建一个新的、空的实例对象 obj

  2. 将 obj.__proto__ 指向构造函数的 prototype

  3. 将构造函数内部的 this,修改为实例

  4. 返回实例 obj

如果使用 PPrototype 指代原型对象,那么构造函数 Person、原型 PPrototype、实例 p1,p2 之间的关系如下

// -> 表示指向
Person.prototype -> PPrototype
p1.__proto__ -> PPrototype
p2.__proto__ -> PPrototype
PPrototype.constructor -> Person

Function

  • Function 是最顶层的构造器

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

  • Function.__proto__ === Function.prototype

Object 是最顶层的对象

  • 所有对象都继承 Object 的原型

  • Object 是 Function 构造出来

  • Object.__proto__ === Function.prototype

  • Object.prototype.__proto__ === null

函数的 __proto__

函数也是对象,也有 __proto__ 指向 Function.prototype

函数的 prototype.__proto__

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

即 函数.prototype.__proto__ === Object.prototype