资源
- 推荐zeal:离线文档查看器 https://zealdocs.org/
- 推荐w3c:线上文档 https://www.w3school.com.cn/
- 本笔记参考视频,李立超:BV1mG411h7aD
- 我的笔记:https://gitee.com/plusmile/stackedit-app-data.git
严格模式
- 代码运行模式:正常模式,语法检查不严格,能不报错就不报错;
- 严格报错,语法检查变得严格;禁止一些语法;更容易报错;在需要开严格模式的作用域的代码开头写,“use strict”
- 开发中尽量使用严格模式
类
- 使用object创建对象的问题,无法批量创建,无法区分不同类型
- 类是对象模板,由类来创建对象
- 语法 class 类名 {} 或者 const 类名=class {};创建对象的方法,new 类名(),实质是调用构造函数。
- 类的代码块 ,默认严格模式,类中不能直接写代码
- 类中可直接定义实例属性,在创建实例时直接成为实例的属性,通过实例来访问,属性名=属性值
- 类中使用,static 属性名=属性值,定义静态属性,也叫类属性,静态属性智能通过类访问,实例无法访问
- 使用 函数名(){}的方法添加实例方法,实例方法中的this就是当前实例
- 使用 static 函数名(){}的方法添加静态方法,静态方法中的this就是当前类
- 简单说,谁调用this指向谁
- 构造函数 constructor(){},固定写法
- 封装,装指对象是存储不同属性的容器,封是指,对象还负责数据安全。
- 私有属性,只有类内可以访问,方式 #属性名; ,然后使用getter和setter方法来操作属性,get 属性名(){return this.#属性名 };set 属性名(参数){this.#属性名 =xxx,可以加判断};这样当使用 实例.属性名 时,看起来是直接调用和修改,但实际是调用了相应的get set方法
- 多态,在JS中不会检查参数的类型,所以任意数据都可以作为参数传递,天生具有多态性,但有时太过了,需要加判断进行限制。多态指调用某个函数时,无须指定的类型,只需要对象满足某些条件即可。增加了代码复用性。
- 继承,使用extends;有继承那就有重写函数;重写构造函数时,构造函数的第一行必须为super(),表示调用父类构造函数,该传参也要传参;在方法中可以使用super来引用父类的方法
- OCP开闭原则,对修改关闭,对扩展开放
- 对象存储属性的位置:1.对象自身,直接通过对象添加的属性,obj.xxx=xxx,以及在类中使用x=y的形式添加的属性;2.原型对象,还有一些内容,如xxx(){}和主动向原型中添加的属性或方法,存储在其他的对象,也就是原型(prototype)对象中,在对象的
__proto__
属性中存储原型对象的地址 - 访问属性时,先在自身中找, 没有时再去原型对象中找再没有就去原型链中找,找不到返回undefined;作用域链是找变量,找不到会报错
原型对象
- 访问原型方式,使用
对象.__proto__
(不推荐)或者Object.getPrototypeOf(对象)
- 原型对象中的数据有,1.对象中的属性和方法,2.constructor(对象的构造函数)
- 原型对象也有原型,所以就会出现原型链,原型链的末尾是null,结尾上一个原型是Object的原型。
- 同类型对象的原型同一个对象,可以用===判断
- 提高复用性,减少内存使用
- 继承是通过原型来实现的,当继承时,子类的原型就是父类的实例
- 原型链例子:cat->animal->object->objcet原型->null
- 修改原型,1是通过
对象.__proto__
(强烈不推荐)修改,2是通过类的prototype来访问,类.prototype
。会修改所有实例的原型。原型尽量不要改,改了通过第二种改,而且只修改prototype属性,不给prototype赋值。 - 可以通过
对象名 instanceof 类名
来判断实例对象是否是某个类的实例,检查的是对象原型链上是否有该类实例 - 使用in检查对象属性,无论属性在自身还是原型都返回true;可以使用
对象.hasOwnProperty('属性名')
来检查一个属性名是否在自身(不推荐);使用新的Objcet.hasOwn(对象,'属性名')
来检查
旧类
- 旧类指以前的方式创建的类,使用函数定义,function Person(){}+new Person()的方式来创建实例。
- 使用函数创建的旧类,直接在函数体中对属性赋值,对于方法,使用
类.prototype.函数名=function(){}
添加 - 添加静态属性和方法,
类.staticPrototy=xxx``类.staticMethod=function(){}
- 为避免分散,一般放在立即执行函数中,把函数返回函数对象赋值给一个变量;想要继承类,直接在令 子类.protoytpe=new 父类() 即可。
- 认识即可,有新旧转换工具
new
- 使用new调用函数时,这个函数将会被作为构造函数调用,会发生以下事情
- 创建一个空白普通的JS对象实例(Object对象 {})
- 将新实例的prototype属性指向构造函数的prototype属性
- 使用实参来执行构造函数,并且将新对象设置为函数中的this
- 如果构造函数返回的是非原始值,则该值会作为new运算的返回值返回
- 如果构造函数返回的是原始值或者没有指定返回值,则将新实例作为返回值
- 所以不给构造函数设置返回值
对象分类
- 内建对象,由ES标准所定义的对象,如Object,Function,String…
- 宿主对象 ,由浏览器提供的对象,如BOM\DOM
- 自定义对象