JS知识点复习(一)

Rinsann 2021年08月23日 333次浏览

知识点

基本概念

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

控制语句

  • if...else
  • for...

对象

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

难点

JS三座大山

原型、this、AJAX

最重要的知识

第一个重要知识:

JS公式:对象.proto===其构造函数.prototype,JS唯一公式,不会就套公式

第二个重要知识:

根公理:Object.prototype 是所有对象的(直接或间接)原型,公理就是规定好的。

第三个重要知识:

函数公理:所有函数都是由Function构造的,任何函数.proto === Function.prototypr,任意函数包括Object/Array/Function

XXX的原型

  • {name:’Rick’} 的原型
  • [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

错在哪

  • Object.prototype这个地址 和 Object.prototype 对象的区别
  • 对象里面从来不会包含另一个对象,它只会包含另一个对象的地址

JS世界的构造顺序

创建根对象 #101(toString),根对象没有名字
创建函数的原型 #208(call /apply),原型 __p 为 #101
创建数组的原型 #404(push/pop),原型 __p 为 #101
创建 Function #342,原型 __p 为 #208
用 Function.prototype 存储函数的原型,等于 #208
此时发现 Function 的 __proto__ 和 prototype 都是 #208
用 Function 创建 Object
用 Object.prototype 存储对象的原型,等于 #101
用 Function 创建 Array 
用 Array.prototype 存储数组的原型,等于 #404
创建 window 对象
用 window 的 'Object' 'Array' 属性将 7 和 9 中的函数命名
记住一点,JS 创建一个对象时,不会给这个对象名字的

用 new Object() 创建 obj1
new 会将 obj1 的原型 __p 设置为 Object.prototype,也就是 #101
用 new Array() 创建 arr1
new 会将 arr1 的原型 __p 设置为 Array.prototype,也就是 #404
用 new Function 创建 f1
new 会将 f1 的原型 __p 设置为 Function.prototype,也就是 #208

自己定义构造函数 Person,函数里给 this 加属性
Person 自动创建 prototype 属性和对应的对象 #502
在 Person.prototype #502 上面加属性
用 new Person() 创建对象 p
new 会将 p 的原型 __p 设为 #502 

图解

image20210901220750394.png

总结

构造函数

  • 用来构造对象的
  • 会与现存好对象的原型,原型的原型的根
  • new 的时候将对象的__p指向原型

对象

  • 所有对象都直接或间接指向根对象
  • 如果对象想要分类,就在原型链上加一环
  • 用构造函数可以加这一环

思考

  • 如果加了一环之后,想再加一环怎么办(继承)。