JS总结

145 阅读2分钟

第一个重要知识:JS公式

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

第二个重要知识: 根公理

Object.prototype是所有对象的(直接/间接)原型

第三个重要知识:函数公理

所有函数都是由Function构造的

任何函数.__proto__ ===Function.prototype

任何函数有Object/Array/Function

错误一

XXX的原型

  • {name :'frank'} 的原型
  • [1,2,3]的原型
  • Object的原型

解读

  • Object的原型是Object.__proto__ :对
  • Object的原型是Object.prototype :错

错在哪

  • 【的原型】 等价于【.__proto__】
  • 中文的【原型】无法区分__proto__ 和 prototype
  • 所以我们只能约定,原型默认表示__proto__
  • 只不过__proto__正好等于某个函数的prototype

错误二

问题

  • [1,2,3]的原型是Array.prototype
  • 你又说Object.prototype是所有对象的原型
  • 那为什么Object.prototype不是[1,2,3]的原型

错在哪

  • 原型分两种:直接原型和间接原型
  • 对于普通对象来说,Object.prototype是直接原型
  • 对于数组,函数来说,Object.prototype是间接原型

错误三

Object.prototype不是根对象

理由

  • Object.prototype是所有对象的原型
  • Object是Function构造出来的
  • 所以,Function构造了Object.prototype
  • 推论,Function才是万物之源啊!

错在哪

  • Object.prototype 和Object.prototype对象的区别
  • 对象里面从来都不会包含另一个对象

JS世界的构造函数

  • 1.创建根对象#101(toString),根对象没有名字
  • 2.创建函数的原型#208(call/apply),原型__p为#101
  • 3.创建数组的原型#404(push/pop),原型__p为#101
  • 4.创建Function#342 ,原型__p为#208
  • 5.用Function.prototype存储函数的原型,等于#208
  • 6.此时发现Function的__proto__和prototpe都是#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创建一个对象时,不会给这个对象名字