再次理解 JavaScript 中的 prototype 和 __proto__

468 阅读1分钟

一、理清一些概念

  • objectObject 不一样。object 是一种数据类型,是八大数据类型之一,数组、函数、日期、正则都是该数据类型的一种;Object 是一种构造函数,由 Function 创建(同理,Array 也是一种构造函数,由 Function 创建)。
  • 区分根对象和根对象的地址。根对象没有名字,但可以写为:Object.prototype 对象;根对象地址可以写为:Object.prototype,该地址指向根对象。
  • window'Object''Array' 属性只是将构造函数 ObjectArray 进行了命名。
  • xxx 的原型” 可以理解为 xxx.__proto__

二、理解 JavaScript 中的 prototype 和 __proto__

3 个重要知识点

  • JS 公式对象.__proto__ === 其构造函数.prototype
  • 根公理Object.prototype 是所有对象的(直接或间接)原型。
  • 函数公理:所有函数都是由 Function 构造。

JS 世界的构造顺序

  1. 创建根对象 #101(toString),根对象没有名字。
  2. 创建函数的原型 #208(call /apply),原型的 __proto__ 为 #101。
  3. 创建数组的原型 #404(push/pop),原型的 __proto__ 为 #101。
  4. 创建 Function #342,原型的 __proto__ 为 #208。
  5. Function.prototype 存储函数的原型,等于 #208。
  6. 此时发现 Function __proto__prototype 都是 #208。
  7. Function 创建 Object
  8. Object.prototype 存储对象的原型,等于 #101。
  9. Function 创建 Array
  10. Array.prototype 存储数组的原型,等于 #404。
  11. 创建 window 对象。
  12. window'Object' 'Array' 属性将 7 和 9 中的函数命名。
  13. 记住一点,JS 创建一个对象时,不会给这个对象名字的。 Image.png