JS基本知识点
基本概念
- 内存,变量,数据变量
- 对象,作用域,运算符..
控制语句
if...else..while, switchfor...
对象
- 原型,原型链
- 对象分类
new一个新对象- 构造函数
this的隐式传递和显示传递
JS难点
JS三座大山
- 原型
thisAjax- 如果还没理解,也没关系,没问题,反复学反复理解,突破这三座大山
JS唯一的公式
-
对象._proto_ === 其构造函数.prototype -
JS根公理Object.prototype是所有对象(直接或间接)的原型
函数公理
- 所有的函数都是由
Function构造的 任何函数._proto_ === Function.prototype任何函数都有Ojbect/Array/Function
问题
原型问题
{name: 'frank'}的原型
答:Object.prototype[1,2,3]的原型
答:Array.prototypeObject的原型
答:Function.prototypeObject的原型是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是所有对象的原型Object是Function构造出来的- 因此,
Function构造了Object.prototype,Function才是根对象
产生疑惑的原因
-
Object.prototype和Object.prtototype对象的区别,Object.prototype可以指的是地址,地址包含在了Ojbect.prototype对象里。实质上,Function 构造了Object.prototype的地址,而非对象 -
对象里面从来都不会包含另外一个对象,只包含了对象的地址
-
为什么
只有函数有prototype属性? 因为JS通过new来生成对象,但是仅靠构造函数,每次生成的对象都不一样。 有时候需要在两个对象之间共享属性,由于JS在设计之初没有类的概念,所以JS使用函数的prototype来处理这部分需要被共享的属性,通过函数的prototype来模拟类: 当创建一个函数时,JS会自动为函数添加prototype属性,值是一个有constructor的对象。
JS世界的构造顺序
构造顺序1
- 创建根对象
#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创建一个对象时,不会给这个对象名字
构造顺序2
- 使用
new Object()创建obj1 new会将obj1的原型_p设置为Object.prototype, 也就是#101- 使用
new Array()创建arr1 new会将arr1的原型_p设置为Array.prototype, 也就是#404- 使用
new Function创建1 new会将f1的原型_p设置为Function.prototype, 也就是#208
构造顺序3
- 自己定义构造函数
Person, 函数里给this加属性 Person自动创建prototype属性和对应的对象#502- 在
Person.prototype,#502上面加属性 - 使用
new Person()创建对象 new会将p的原型_p设为#502
原型图表
总结
构造函数
- 构造函数是用来构造对象的,会预先存好对象的原型,原型的原型是根
new的时候将对象的_p指向原型
对象
- 所有的对象都直接或间接的指向根对象
- 如果对象想要分类,就在原型链上加一环,用构造对象可以加这一环
思考
如果加了一环,想再加一环怎么办?