JavaScript小总结

197 阅读3分钟

JS基本知识点

基本概念

  • 内存,变量,数据变量
  • 对象,作用域,运算符..

控制语句

  • if...else..
  • while, switch
  • for...

对象

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

JS难点

JS三座大山

  • 原型
  • this
  • Ajax
  • 如果还没理解,也没关系,没问题,反复学反复理解,突破这三座大山

JS唯一的公式

  • 对象._proto_ === 其构造函数.prototype

  • JS根公理Object.prototype是所有对象(直接或间接)的原型

函数公理

  • 所有的函数都是由Function构造的
  • 任何函数._proto_ === Function.prototype
  • 任何函数都有Ojbect/Array/Function

问题

原型问题

  • {name: 'frank'}的原型
    答:Object.prototype
  • [1,2,3]的原型
    答:Array.prototype
  • Object的原型
    答:Function.prototype
  • Object的原型是Object._proto_
    答:对
  • Object的原型是Ojbect.prototype
    答: 错

原因: [xxx的原型]等价于[._proto_]

疑惑问题1

[1,2,3]的原型是Array.prototype, Object.prototype是不是所有对象的原型? 如果是,那么为什么Object._proto_不是[1,2,3]的原型

原因

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

疑惑问题2

为什么Ojbect.prototype不是根对象

疑惑的理由

  • Oject.prototype是所有对象的原型
  • ObjectFunction构造出来的
  • 因此,Function构造了Object.prototype,Function才是根对象

产生疑惑的原因

  1. Object.prototypeObject.prtototype对象的区别,Object.prototype可以指的是地址,地址包含在了Ojbect.prototype对象里。实质上,Function 构造了Object.prototype的地址,而非对象

  2. 对象里面从来都不会包含另外一个对象,只包含了对象的地址

  3. 为什么只有函数有prototype属性? 因为JS通过new来生成对象,但是仅靠构造函数,每次生成的对象都不一样。 有时候需要在两个对象之间共享属性,由于JS在设计之初没有类的概念,所以JS使用函数的prototype来处理这部分需要被共享的属性,通过函数的prototype来模拟类: 当创建一个函数时,JS会自动为函数添加prototype属性,值是一个有constructor的对象。

JS世界的构造顺序

构造顺序1

  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对象(之前都没有名字)
  12. 使用window'Object','Array'属性将7和9中的函数命名
  13. JS创建一个对象时,不会给这个对象名字

构造顺序2

  1. 使用new Object()创建obj1
  2. new会将obj1的原型_p设置为Object.prototype, 也就是#101
  3. 使用new Array()创建arr1
  4. new会将arr1的原型_p设置为Array.prototype, 也就是#404
  5. 使用new Function创建1
  6. new会将f1的原型_p设置为Function.prototype, 也就是#208

构造顺序3

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

原型图表

总结

构造函数

  • 构造函数是用来构造对象的,会预先存好对象的原型,原型的原型是根
  • new的时候将对象的_p指向原型

对象

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

思考

如果加了一环,想再加一环怎么办?