数据劫持与回调函数

发布于:2022-11-01 ⋅ 阅读:(308) ⋅ 点赞:(0)

数据劫持

        数据驱动视图

数据劫持

        数据劫持就是吧原始数据复刻一份出来

        注意:复刻出来的数据不允许修改

如何实现数据劫持

        语法: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条件的书写

        核心:我们准备一个数据结构,里面保存的就是

发布订阅模式

        就是我们自己模拟一个事件侦听器

        作用:把想要做的事情放到一个函数中,当想要执行的时候触发函数

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到