js世界之原型

187 阅读1分钟

三大定律

  • js唯一公式

    对象.__proto__ === 其构造函数.prototype

  • 根公理
    Object.prototype 是所有对象的 (直接或间接) 原型

  • 函数公理

    • 所有的 函数 都是由 Function 构造的
    • 任何函数.__proto__ === Function.prototype

    • 任何函数包括Object、Array、Function

误区三

XXX的原型 __proto__ ? prototype

  • Object 的原型是 Object.prototype 错误
  • Object 的原型是 Object.__proto__ 正确

分析

  • 中文的原型无法区分 prototype、__proto__
  • 因此原型默认表示 __proto__ ,即 xxx 的原型等价于 xxx.__proto__
  • __proto__ 只是正好等于某个函数的 prototype

[1,2,3]的原型是 Array.prototype 居然不是 Object.prototype ?

分析

  • 对象分为两种:普通对象(Object)、特殊对象(Array、Function)
  • Object.prototype 是普通对象的 直接 原型
  • Object.prototype 是特殊对象的 间接 原型

Object.prototype 不是根对象 ?

  • 所有函数都是由 Function 构造的包括 Object,根对象不应该是 Function.prototype ? 错误

分析

  • 所有函数的原型才是 Functio.prototype ,具体关系查看js世界图

构建js世界图

  • js创建对象时不会给这个对象命名
  • 首先从创建无名根对象即对象的原型开始
  • 依此创建 函数、数组 的原型
  • 创建无名Function
  • Function.__proto__ === Function.prototype (所有函数都是由Function构造的)
  • 由Function创建无名的Object、Array
  • Object.prototype存储了 对象的原型
  • Array.prototype存储了 数组的原型
  • 当创建了 window 时,用 window 对象的属性给函数命名即可引用
  • 原型的原型是根对象

完整图示

  • 使用构造函数创建对象具体看这里哦
  • 构造函数会预先存好对象的原型

-------------------------------------------------------------------------来自方方老师的美丽图示