数据劫持
数据驱动视图
数据劫持
数据劫持就是吧原始数据复刻一份出来
注意:复刻出来的数据不允许修改
如何实现数据劫持
语法:Object . defineProperty(哪一个对象,属性名,{配置项})
配置项中的内容:
value:表示这个属性的属性值
writable:表示这个数据是否可以被重写(重新设置)(默认值事false,表示不能被重写,只读)(选填是true,表示可以被重写,可以设置)
enumerable:表示这个属性是否可以被枚举(遍历)(默认值是false,表示不可以被枚举)(选填项true,表示可以被枚举)
get :是一个函数,就是我们的获取器
返回值:是我们的结果
注意:不能和value和writable一起使用,会报错
set : 就是一个设置器
就是修改我们的值
数据劫持升级
之前的需要创建一个新的空对象
升级之后不需要创建一个空对象,在自己身上劫持
升级语法:
Object . defineProperties(对象,{哪一个属性,{配置项}})
{}里面需要书写内容 :{哪一个属性,{配置项}}
配置项:
value:表示这个属性的属性值
writable:表示这个数据是否可以被重写(重新设置)(默认值事false,表示不能被重写,只读)(选填是true,表示可以被重写,可以设置)
enumerable:表示这个属性是否可以被枚举(遍历)(默认值是false,表示不可以被枚举)(选填项true,表示可以被枚举)
get :是一个函数,就是我们的获取器
返回值:是我们的结果
注意:不能和value和writable一起使用,会报错
set : 就是一个设置器
就是修改我们的值
问题:只能修改已经存在的,不能修改之后添加进去的
数据代理
在我们的社区(程序员交流群)依旧称之为数据劫持
数据代理也是劫持
代理语法:
const ( let / var ) 变量名 = new Proxy(要代理的对象,{配置项})
返回值:就是代理的结果(就是我们的实例)
回调函数(callback)
把一个函数当作一个参数传递到另一个函数中,在另一个中以形参的方式调用这个函数,把这个函数叫做另一个函数的回调函数
回调函数的作用
封装代码
封装异步代码
想要在异步末尾做一些事情
回调地狱
就是指回调函数的嵌套使用,就会形成回调地狱
影响:造成代码的可读性与维护性低
回调地狱的解决
ES6中提供了内置构造函数:promise
注意:因为回调函数层层嵌套形成回调地狱
回调函数是因为要封装代码,并且封装的是异步代码
以promise的形式来封装代码
认识promise
语法:const 变量 = new Promise (你要做的事情,是一个函数)
即:const 变量 = new Promise (function (){})
实例是一个对象,一般把这个实例叫做promise对u想
promise的三个状态
pending:表示一种继续的状态
rejected:表示一种失败的状态
resolve(fulfilled):表示一种成功的状态
promise的状态转换
1,从继续转换为成功
2,从继续转换为失败
promise方法
then()
语法:promise对象 . then(function(){ })
成功的时候执行then()方法里面的函数
catch()
语法:promise对象 . catch(function(){ })
失败的时候执行catch()里面的函数
finally()
语法:
完成的时候执行里面的代码
这个方法多使用在loding效果的是线上
以上方法通过实例来调用
all()
语法:promise . all([多个promise对象])
作用:只有所有的promise都成功的时候才会返回成功
race()
语法:promise . race([多个promise对象])
作用:根据时间来计算,哪个现有结果执行哪一个,不管是成功还是失败
allSettled()
语法:Promise . all Settled([多个promise对象])
作用:会把所有的promise结果保留在一个数组中,不管是成功还是失败
resolve()
作用:强制成功
reject()
作用:强制失败
promise 的进阶语法
在第一个then()方法里面返回一个新的premise对象
这个时候在then()方法外面接受这个结果
scync和await
是两个关键字
是ES7到ES8出现的
就是promise在解决回调地狱的时候依旧不够友好
scync
关键字
作用1:就是把一个函数变成异步函数
注意:只是把这个函数叫做异步函数,但是并不改变这个函数本身的性质
作用2:就是为了书写await
书写位置:函数前面(不分种类)
await
关键字
书写位置:书写在一个有 async 的函数中
作用:等待 await 后面的代码的执行结果
注意:await后面必须跟一个promise对象
如果没有拿到结果(失败的代码),后面代码不执行
之前在then()里面的结果可以用一个变量来接收
promise的封装
如果返回的是一个失败的promise那么后续代码不能正常执行
解决方案
第一中解决方案
使用try { } catch ( ){ }
第二种解决方案
不执行失败的函数,每次都执行成功的函数
事件循环机制
js是单线程
同一时间只能执行一个代码
数组扁平化
就是把一个多维数组变成一维数组
flat()
ES6中数组常用方法
语法:数组 . falt(数字)
数字的作用:就是要展开几层
如果不知道几层,Infinity(正无穷的意思)
认识设计模式
为了解决一类问题而给出的简洁而优化的解决方法
单例模式
一个构造函数一生只能创建一个实例
核心代码
let instince = null
function singleton = (){if(!instince)instince = new 构造函数 return instince}
问题:不能随便传递参数
之前都是通过new的方式 现在是通过函数调用的方式得到对象
单例模式变形
第一次变形:在全局值暴露一个变量
使用闭包和自执行函数
第二次变形:解决参数问题
在构造函数的原型对象上定义一个方法
第三次变形:解决和 new 使用的问题
策略模式
出现原因:代码的阅读性和维护性低
作用:节省if条件的书写
核心:我们准备一个数据结构,里面保存的就是
发布订阅模式
就是我们自己模拟一个事件侦听器
作用:把想要做的事情放到一个函数中,当想要执行的时候触发函数