前端升级打怪路 : Js总结

118 阅读2分钟

JS三大定理

iShot2020-05-2017.12.31

拨乱反正的三个问题

问题1

{name:frank} 的原型
[1,2,3] 的原型
Object 的原型
  • 这里面的原型到底是什么?是._ _proto_ _还是prototype?
    • 中文的「原型」无法区分._ _proto_ _prototype
    • 所以我们只能约定,原型默认表示._ _proto_ _
    • 只不过._ _proto_ _好等于某个函数的prototype

问题2

 let  arr = [1,2,3]
 arr 的原型是 Array.prototype
  • 定理中:Object.prototype是所有对象的原型,为什么arr的原型不是Object.prototype而是Array.prototype?
    iShot2020-05-2016.44.33
    • 原型分两种:直接原型和间接原型
    • 对于普通对象来说, Object.prototype是直接原型
    • 对于数组、函数来说, Object.prototype是间接原型

问题3

Object.prototype是所有对象的原型
Object是Function构造出来的
所以, Function构造了Object.prototype
  • 根据上面的描述:Function才是根对象啊?Object.prototype不是根对象?
    WechatIMG1
    • 从上图可知Function只是创造了Object.prototype这个存地址的属性,而Object.prototype的对象,不是Function创造的.
    • 对象里从来不会包含另一个对象,只是包含另一个对象的地址
    • 要清楚知道Object.prototype地址Object.prototype对象的区别

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存储对象的原型,等于#1019, 用Function创建Array
  9. Array.prototype存储数组的原型,等于#404
  10. 创建window对象
  11. window'Object' 'Array'属性将7和9中的函数命名
  12. 记住一点, JS创建一个对象时,不会给这个对象名字的
    WechatIMG2
    iShot2020-05-2019.35.52
  • 构造函数的构造顺序
    1. 自己定义构造函数Person,函数里给this加属性
    2. Person自动创建prototype属性和对应的对象#502
    3. Person.prototype #502上面加属性
    4. new Person()创建对象p
    5. new会将p的原型._ _proto_ _设为#502

总结

  • 构造函数
    • 是用来构造对象的
    • 会预先存好对象的原型,原型的原型是根new的时候将对象的._ _proto_ _指向原型
  • 对象
    • 所有对象都直接或间接指向根对象
    • 如果对象想要分类,就在原型链上加一环用构造对象可以加这一环
  • 继承
    • 如果加了一环之后,想再加一环,是需要「继承」的