JavaScript之ES中的类继承与Promise

ES5中的类及继承

javascript 复制代码
    //人
    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.eat = function () {
        console.log(this.name + "eat");
    }
    //程序员,继承,人
    function Programmer(name,age,language){
        //构造函数继承
        Person.call(this,name,age);
        //新属性
        this.language = language;
    }
    //继承,人,原型
    Programmer.prototype.__proto__ = Person.prototype;
    //设置原型上的新方法
    Programmer.prototype.code = function () {
        console.log(this.name + "code");
    }

ES6中的类及继承

javascript 复制代码
    class Person {
        //属性设置在构造函数中
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }
        //设置原型上的方法
        //大括号中的就是原型
        eat() {
            console.log(this.name + "eat");
        }
    }
    //声明Programmer类,继承Person类
    //通过关键字继承父类
    class Programmer extends Person {
        //extends关键字继承原型方法
        //构造函数
        //如果子类和父类的属性一样,则子类可以不写构造函数,在实例化时继承父类的构造函数
        //如果有新属性则必须写构造函数
        constructor(name, age, language) {
            //通过super关键字继承父类的构造函数
            super(name, age);
            //设置新属性
            this.language = language;
            //如果子类写了构造函数,就必须通过super继承父类的构造函数
            //而且必须在设置新属性之前吸纳继承父类的构造函数
        }
        //原型通过extends自动继承
        //设置子类的新方法
        code() {
            console.log(this.name + "code");
        }
    }
    //实例化
    let p = new Programmer("张三", 20, "java");
    p.eat();
    p.code();

Promise

同步与异步

同一个文件中的JS是一个同步的过程

javascript 复制代码
    console.log(1);
    console.log(2);

第二行的代码要等第一行的代码结束再执行

javascript 复制代码
    function load(){
        //创建script标签,把1.js加载到页面中
        let script = document.createElement('script');
        script.src = '1.js';
        //插入到head标签中
        document.head.appendChild(script);
    }

从其他文件中引入的js代码与单签文件中的js代码是异步关系

异步关系的代码,执行过程中就是"竞速"

JS中有很多异步关系的代码

比如获取数据就是异步过程,页面上的其他内容,不会等待获取数据之后再创建

但是,有的内容就需要获取到数据后,才能展示,如何解决?

需求:在异步"竞速"的过程中,把代码捋顺出来------Promise

javascript 复制代码
    function load(){
        return new Promise((resolve,reject)=>{
            let script = document.createElement('script');
            script.src = '1.js';
            document.head.appendChild(script);
            script.onload = function (){
                resolve("成功")
            }
            script.onerror = function (){
                reject("失败")
            }
        })
    }
    load().then(()=>{
        console.log(2);
    },()=>{
        console.log("有错误");
    })

捋顺序的核心,时Promiase的回调函数和then里面的方法

then里面的方法,会在回调函数执行完毕之后再执行

在回调函数中,需要人为规定"成功"和"失败"两个状态

当处于成功状态时,就执行resolve方法;当处于失败时,就执行reject方法

如果回调函数最终执行了resolve方法,后续就会执行then中的第一个方法;如果回调函数最终执行了reject方法,后续就会执行then中的第二个方法

resolve和reject两个方法的参数,会传递给then的参数

javascript 复制代码
    function load(src){
        return new Promise((resolve,reject)=>{
            let script = document.createElement('script');
            script.src = src;
            document.head.appendChild(script);
            script.onload = function (){
                resolve("成功")
            }
            script.onerror = function (){
                reject("失败")
            }
        })
    }
    //按照顺序依次引入a-d.js,最后打印加载完毕
    load('a.js').then(()=>{
        load('b.js')
        //load方法返回Pomise对象
        //但是没有把这个对象返回
        //所以这个函数没有返回值
        //then方法会提供一个空对象作为返回值
    },()=>{
        console.log('有错误')
    }).then(()=>{
        load('c.js')
        //load方法返回Pomise对象
    },()=>{
        console.log('有错误')
    }).then(()=>{
        load('d.js')
        //load方法返回Pomise对象
    }).then(()=>{
        console.log('加载完毕')
    },()=>{
        console.log('有错误')
    })

以上代码中,真正有顺序的只是加载a.js在最前面,加载b.js一定在a.js之后

其余c-d的加载和打印加载完毕,没有书序,还是处于异步"竞速"状态

Promise对象只是以确保,当前对象的回调函数与当前then里面的方法的执行顺序

then方法的返回值

如果执行方法有返回值,则就会把放回的返回值设置成then方法的返回值

此例中,then里面执行第一个函数

此时第一个函数没有返回值

不管执行then里面的哪一个方法如果没有返回值,则then方法会自动提供一个空Promise对象作为返回值

只有Promise对象的回调函数和该对象调用的then方法中的函数才有先后关系

正确写法:

javascript 复制代码
    //按照顺序依次引入a-d.js,最后打印加载完毕
    load('a.js').then(()=>{
        return load('b.js')
        //load方法返回Pomise对象
        //但是没有把这个对象返回
        //所以这个函数没有返回值
        //then方法会提供一个空对象作为返回值
    },()=>{
        console.log('有错误')
    }).then(()=>{
        return load('c.js')
        //load方法返回Pomise对象
    },()=>{
        console.log('有错误')
    }).then(()=>{
        return load('d.js')
        //load方法返回Pomise对象
    }).then(()=>{
        console.log('加载完毕')
    },()=>{
        console.log('有错误')
    })
相关推荐
鱼钓猫的小鱼干2 分钟前
table 表格转成 excell 导出
前端·vue·excel
一只搬砖的猹3 分钟前
cJson系列——常用cJson库函数
linux·前端·javascript·python·物联网·mysql·json
天天进步20156 分钟前
Java全栈项目 - 汽车维修服务管理平台
java·开发语言·汽车
CodeClimb15 分钟前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
qq_4305839717 分钟前
QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
开发语言·笔记·qt
懒羊羊我小弟22 分钟前
包管理工具npm、yarn、pnpm、cnpm详解
前端·npm·node.js·yarn·cnpm
Crossoads24 分钟前
【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应
android·开发语言·数据库·深度学习·机器学习·计算机外设·汇编语言
ppo_wu26 分钟前
更改 pnpm 的全局存储位置
前端·vue
Zik----27 分钟前
Anaconda搭建Python虚拟环境并在Pycharm中配置(小白也能懂)
开发语言·人工智能·python·机器学习·pycharm
凯子坚持 c33 分钟前
解锁仓颉编程语言的奥秘:枚举类型、模式匹配与类接口全解析
开发语言·华为·harmonyos