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('有错误')
    })
相关推荐
leobertlan7 小时前
2025年终总结
前端·后端·程序员
子兮曰7 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
冷雨夜中漫步8 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
百锦再8 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君8 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再8 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI8 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
颜酱9 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python