JS的总结

JS的知识点

基本概念

  • 内存
  • 变量
  • 数据类型
  • 对象

控制语句

  • if...else...
  • for...

对象

  • 原型、原型链
  • 对象分类
  • new一个新对象
  • 构造函数
  • this 的隐士传递和显示传递

三个最重要知识:

  1. JS公式:
    对象.__proto__ === 其构造函数.prototype
  2. 根公理:
    Object.prototype是全部对象的(直接或间接)原型
  3. 函数公理:javascript

    • 全部函数都是由Function构造的
    • 任何函数.__proto__ === Function.prototype
    • 任意函数都有Object/Array/Function

容易犯错观点

  • {name:‘frank’}.__proto__ 的原型 === Object.prototype
  • [1,2,3].__proto__ 的原型 === Array.prototype
  • Object.__proto__ 的原型 === Function.prototype

问题:
Object的原型是Object.__proto__?
解读:
对的. [的原型]等价于[.__proto__];中文的[原型]没法区分.__proto__与prototype。因此默认约定了原型用.__proto__。
可是并不意味这两个是彻底相等的意思java

观点矛盾:数组

  • [1,2,3]的原型是Array.prototype
  • Object.prototype是全部对象的原型
  • 为何Object.prototype不是[1,2,3]的原型呢?

解读:app

  • 原型分2种状况,直接原型和间接原型
  • 对于普通对象来讲,Object.prototype是直接原型
  • 对于数组,函数来讲,Object.prototype是间接原型

本身属性
直接原型
间接原型

错误观点:
Object.prototype不是根对象(X)
理由:函数

  • Object.prototype是全部对象的原型
  • Object.prototype是Function构造出来的
  • 因此,Function构造了Object.prototype
  • 推论,Function才是万物之源

解答:this

  • Object.prototype 和 Object.prototype对象 的区别
  • 对象里面历来不会包含另外一个对象,只会包含另外一个对象的地址
  • Function构造了Object.prototype的地址,并无构造那个对象,Object.prototype是根对象,可是不能说Function就是根对象,只能说构造出存储根对象地址的属性

Object.prototype 和 Object.prototype对象 区别:

  • 就代码而言,没办法区分,只能用内存图来区分,有2个意思
  • Object.prototype在Objec里面,由于这里的prototype指2个东西:地址和对象,在中文描述时,默认地址就是那个对象。
  • 若是问Object.prototype这个地址对应的对象在不在Object里面?回答是不在,由于它在路径#202[toString...](这里内存图随便一个地址)里面,而Object在prototype:#202这个位置

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__和prototype都是#208
  7. 用Function建立Object(实际没有名字)
  8. 让Object.prototype等价于#101(有名字了)
  9. 用Function建立Array(实际没有名字)
  10. 让Array.prototype等价于#404(有名字了)
  11. 建立window对象(不属于JS世界)
  12. 用window的'Object''Array'属性将7和9中的函数命名
  13. 记住一点,JS建立一个对象,不会给这个对象名字

图示

示例

  • Object.prototype.__proto__ === null
  • Function.prototype.__proto__ === Object.prototype
  • > var f = () => {}
    < undefined
  1. f.__proto__ === Function.prototype
  2. Funciont.__proto__ === Function.prototype
  3. Array.prototype.toString.__proto__ === Funciont.prototype
  4. Object.__proto__ === Function.prototype
  5. Array.prototype === [].__proto__(公式反着用)
相关文章
相关标签/搜索