【JS全解】JS总结

194 阅读2分钟

JS中三个公理

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

几个误区

  • “的原型”指的是“.__proto__”,因此不能说Object()的原型是Object.prototype。
  • 直接原型和间接原型:
    • 对于普通对象而言,Object.prototype是直接原型。
    • 对于函数、数组对象而言,Object.prototype是间接原型。
  • Function()只是构造出了prototype:#202这个键值对,但并没有构造Object.prototype的对象。因此,根对象不是由Function()构造出来的。
  • 对象里不会包含另一个对象,只会包含另一个对象的地址。

JS世界的构造顺序

  1. 在#101创建根对象{toString()...},目前根对象没有名字。
  2. 在#208创建函数原型{call(),apply()...},#208.__proto__为#101,目前函数原型没有名字。
  3. 在#404创建数组原型{push(),pop()...},#404.__proto__为#101,目前数组原型没有名字。
  4. 在#342创建Function(),Function().__proto__为#208。
  5. 用Function.prototype存储函数原型的地址,等于#208。
    • 此时发现Function.__proto__===Function.prototype。
  6. 用Function()创建Object()
  7. 用Object.prototype存储根对象的地址,等于#101。
  8. 用Function()创建Array()
  9. 用Array.prototype存储数组原型的地址,等于#404。
  10. 创建window对象
  11. 用window的Function、Object和Array属性为4、6、8中的函数命名
  • 注意
    • 直到步骤9,都为JS世界。从步骤10开始,都是浏览器世界。
    • 直到步骤11为止,Function()、Object()、Array()实际上都是没有名字的。
    • JS创建一个对象时,不会给这个对象名字的。

声明对象

![[Pasted image 20220630171801.png]]

let obj = new Object()
  • new会将obj.__proto__设置为Object.prototype。
let arr = new Array()
  • new会将arr.__proto__设置为Array.prototype。
let fn = new Function()
  • new会将fn.__proto__设置为Function.prototype。
  • 对象的构造函数构造出了对象。函数的构造函数构造出了函数。数组的构造函数构造出了数组。