面向对象是一种编程思路,不会改变预期效果
优点:使用面向对象,会提高代码的复用性,便于迭代
创建
1.字面量
let obj={ }
2.构造函数
let obj = new Object()
函数名的首字母大写,一次来和普通的函数区分
new运算符,也叫构造器,配合使用的函数,被称为构造函数
作用:1.执行该函数
2.隐式创建一个对象
3.把该对象和函数的this指向互相绑定
4.可以把this中的属性和方法都加到该对象上
5.函数执行后,返回该对象
代码:
显示效果:
3.工厂模式
代码:
显示效果:
使用
1.通过点语法
2.通过中括号
代码:
显示效果:
原型
每次通过构造函数去去实例化对象,都会生成一个新的内存空间
当项目开发中,往往大量的内存使用,会严重影响性能
原型: 将公有的方法,放到原型中,每次实例化对象,原型中的内容是公有的,不会再分配新的空间给对象(构造函数中的属性/方法 会)
原型中的方法,地址相同,是一个公有的内存
构造函数中的方法,地址不相同。 两个独立的内存
继承
通过某一种方式让一个对象,可以访问并使用到另一个对象中的内容,这种行为我们叫做继承
作用:节省了各个构造函数中,大量重复的属性和方法,提高了开发效率,并节省了内存
代码:
显示效果:
构造函数继承
继承的方法:call与apply方法的使用,达成了构造函数继承的作用
区别:call接受参数时,数量根据被借用者需要的参数而
apply只有两个参数,借用者与数组(存放所有参数)
call 对象冒充,又叫对象借用
语法:被借用者.call(借用者,被借用的参数)
代码:
显示效果:
apply()
方法与call相同,都用于借用对象
语法:被借用者.apply(借用者,[被借用者的参数])
代码:
显示效果:
原型链继承
将父类的实例化对象赋值给子类的原型
语法:子类的构造函数名.constructor=父类的实例化对象
优点:类似于赋值了一个对象,构造函数和原型中所有的数据都可以获取到,简约方便使用
缺点:1.原型链继承自身无法传参
2.父类所有的属性和方法都可以被所有子类共享
组合继承
类式继承,无法获取父类的原型链
原型链继承,无法直接给父类传参
组合继承=类式继承+原型链继承
结合优点,弥补缺点
代码:
显示效果:
传值和传址
传值:简单数据类型,传递数值,开辟新地址
传址:复杂数据类型,传递地址,共享同一个内存空间
浅拷贝:只拷贝数值,不拷贝地址,节省内存,但是因为共享内存,所以互相影响数据
深拷贝:数值和内存都拷贝,内存空间相互独立,不互相影响数据
深拷贝
方法一:
通过JOSN.parse()
和JOSN.stringify()
将通过上述两种方法处理过后的对象赋值给新变量
方法二:
操作符
1.instanceof()
判断一个实例对象,是否是某个函数的实例
语法:对象名 instanceof 函数名
代码:
显示效果:
2.isPrototypeOf() 判断该原型是否是该对象所属原型
语法:原型名.isPrototypeOf(对象名)
代码:
显示效果:
3.hasOwnProperty()
用来检测当前对象中是否有该属性, 返回值为布尔类型
不会检查原型和原型链上的内容,只会去查找构造函数中的内容
语法:对象名.hasOwnProperty("属性/方法名")
代码:
显示效果:
4.delete
用来删除属性
语法:delete 属性
代码:
显示效果:
5.in
检查该对象是否包含指定属性
检查范围包括对象的直接属性和prototype继承来的属性,不包括原型自身的属性/方法(原型重构,被覆盖)
语法:属性/方法名 in 对象
代码:
显示 效果:
拖拽
类
作为创建对象的模板,通过class关键字来定义类
语法:
类中自带的方法:set/get
属性表达式:
类的外部定义,原型的自定义名称用中括号包起来
严格模式(代码规范)
1.在script标签中第一行写
use strict
,表明以下代码使用严格模式(或者式js文件中的第一行)
2.使用代码的定义,使用更加规范,避免一些诡异的运行行为
3.在后续的ES特性和一些Angular等js框架中,要求必须在严格模式下运行
4.使代码的编译和运行更加高效
注意:
1.ES5中,默认为非严格模式,需要使用use strict
,ES6中默认为严格模式
2.不存在变量提升
3.在类和模块{}内部,默认就是严格模式,其实未来所有代码都是运行在模块中,所以可以说
ES6实际把整个语言升级到了严格模式
对变量的影响
1.变量必须要先声明后使用
2.不可以使用任意保留字/关键字作为变量名
3.严格模式不再允许用户删除变量(delete)对对象的影响
1.对只读属性赋值会抛出异常(报错)
2.对不可配置的属性使用delete
操作符会抛出异常
3.对不可扩展的对象添加属性,会抛出异常
4.不可以使用with简化对象访问对函数的影响
1.在普通函数当中,不允许使用this引用当前window对象
2.在严格模式中,函数的参数必须是唯一的(不允许重复)
3.在严格模式中,arguments对象的值,和形参的值是完全独立的,虽然修改形参的值也会反映
到arguments对象中
类的继承
子类通过 extends 关键字来继承父类的所有属性和方法
子类必须在constructor中调用super方法,否则新建实例会报错
ES5和ES6中继承的区别
ES5的继承中,实质是先创造子类的实例对象this,然后再将父类的方法/属性添加到this上面。
ES6的继承中,实质是先创造父类的实例对象this, 然后再将子类的方法/属性添加上必须先通过父类的构造函数完成塑造(this对象–实例对象),然后再对其加工,加上子类自身的属性和方法,如果不调用super方法,子类就得不到this对象
静态属性和静态方法
static关键字
在属性前加上static,为静态属性
方法前:
1.static关键字,表明该方法是一个静态方法
2.需要同故宫类名来调用,而不是在实例(this)上调用
3.如果使用this调用,或者在该方法中使用this,均会出现异常
4.静态方法和非静态方法不重名(不推荐)
5.父类的静态方法,可以被子类继承
显示效果:
Event事件池
类,事件池,记录所有的相关事件及处理函数
事件存放形式:
event={
事件名:[f1,f2,f3],
事件名:[f1,f2,f3]
}
添加事件的功能
删除事件的功能
执行触发的事件
模块化
模块化是运行在服务器上的内容
优点:按需加载
导出:export 分为两种形式自定义和默认 可以导出对象,函数,类,字符串
默认内容:export default 不需要加任何修饰,导入时名字任取
自定义内容:export 导出的内容需要加{}
,导入时名字需要对应
导入:导入指定文件中的指定内容(路径可以是相对路径、绝对路径、网络路径)
import 名称 from 文件地址
导入时,指定内容如果是*号,则表示引入指定路径下的所有内容
import
拥有提前量(自动提升到顶层执行)
重命名
as 关键字XX as xxx
将左侧的名字改为右侧的
在当前文件夹中,名字依旧为左侧
在外部文件导入时,才使用右侧的名字
导入时,依旧可以使用as进行重命名
Promise对象
同步和异步是一种消息通知机制
同步消息阻塞:A调用B,B处理获得结果,才会返回给A,A在这个过程中,一直在等待B的处理结果,没有拿到结果之前,需要A一致等待,直到拿到结果,然后才继续往下执行
异步非阻塞:A调用B,无需等待B的结果,继续运行下一步,B通过状态,通知,回调等方式在完成后,通知A
异步: 事件;定时器;网络请求
promise不解决异步问题,解决的是异步的写法
创建:let p = new Promise(回调函数)
在pormise对象创建时,这个函数执行,函数内this指向window
回调函数中会有两个参数,我们一般用resolve和reject来命名接收
resolve(传递给执行成功后触发的函数 参数) 执行成功
reject(传递给执行失败后触发的函数 参数) 执行失败
p会返回一个对象,其中有一个then方法,then方法会在异步处理结束后执行
pending 内部状态,异步执行中
执行结束后:Fulfillen(标准)Resolved 执行成功,调用resolve改变
Rejected执行失败,调用reject之后改变
自带两个参数:resolve,reject(两个方法)调用这两个方法时,表示异步已经执行结束
then方法会给我们返回一个新的Promise对象
新对象的执行状态
1.返回一个状态为resolve的Promise对象
2.当then的回调函数返回的是一个非Promise对象,then返回的是一个状态为resolve的Promise对象
3.当then返回一个Promise对象时,then返回值也会变成该Promise对象