类 

ES5中的类及继承


    //人
    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中的类及继承

    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是一个同步的过程

    console.log(1);
    console.log(2);

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

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

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

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

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

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

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

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

    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的参数

    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方法中的函数才有先后关系

正确写法:

    //按照顺序依次引入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('有错误')
    })
03-25 18:37