even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、类的建立与继承

constructor方法是类的构造函数是默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个默认的constructor方法会被添加。所以即使你没有添加构造函数,也是有默认的构造函数的。一般constructor方法默认返回实例对象this,但是也可以指定constructor方法返回一个全新的对象,让返回的实例对象不是该类的实例

<script>
//注意,在书写ES6的类的时候,方法与方法之间是不能添加逗号的。
class Test {
    //constructor方法是类的构造函数是默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个默认的constructor方法会被添加。
    constructor(name, age) {
        //new.target 在类中返回的是test这个类,而不是实例化的类,可以通过new.target对静态方法的调用,在类里面也可以通过this.constructor对静态方法调用
        // console.log(new.target.say);
        //也可以判断是否是实例化后的实例
        console.log(this instanceof new.target);
        this.name = name;
        this.age = age;
    }

    //通过返回this实现链式调用
    asw() {
        console.log(`my name is ${this.name},my age is ${this.age}`);
        return this;
    }

    //静态方法前面要添加static进行修饰,同时里面的this表示test这个对象而不是实例化后的类
    //目前ES6未实现静态变量的定义,可以通过test.变量的形式进行定义
    static say() {
        console.log(this.other);
    }

    static other(name, age) {
        if (!(this instanceof Test)) {
            return new Test(name, age);
        }
    }
}

//在继类的时候用extends字实现子类对父类的继承
class Person extends Test {
    constructor(name, age, sex) {
        //调用super关键字实现属性的继承
        super(name, age);
        this.sex = sex;
    }

    ask() {
        //通过super关键字调用父类的方法
        super.asw();
        console.log('are you ok???');
    }
}

//静态属性的调用
Test.say();
//利用静态方法实现类的实例化
Test.other('ccc', 36).asw();
// new Test('aaa', 30).asw();
// new Person('bbb', 20).asw().ask();

 2、async...await的简单使用

  只要函数名之前加上async关键字,就表明该函数内部有异步操作。该异步操作应该返回一个Promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句

//实现自动调用
(async function () {
    try {
        let m = await $.get('./url');
        console.log(m);
    } catch (err) {
        console.log(err);
    }
})();

//用函数的形式调用
async function test() {
    try {
        let m = await $.get('./url');
        console.log(m);
    } catch (err) {
        console.log(err);
    }
}

捕获错误的方法

let fn = () => {    //异步函数
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(100)
        }, 3000)
    })
}

//方法一
// let exe = async () => {
//     console.log('执行中...')
//     try{
//         let val = await fn()
//         console.log(val)
//     } catch(err) {
//         console.error(err)
//     }

// }

//方法二
let exe = async () => {
    console.log('执行中...')
    try{
        let val = await fn().catch(err => { console.err(err)})
        console.log(val)        //这个时候就会返回undefined
    } catch(err) {
        console.error(err)
    }

}

exe()

3、symbol与作用域

  ES6的新增类型,值是由系统提供的symbol函数调用产生的,相同的symbol函数返回的的值是唯一的

  作用: 属性私有化 - 数据保护

let a = Symbol('aaa');
let b = Symbol('aaa');
console.log(a, b, a == b, a === b)
//打印 Symbol(aaa) Symbol(aaa) false false

未使用Symbol时通过闭包实现

let Person = (function() {
    let _sex = ''
    let P = function(name, sex) {
        this.name = name;
        _sex = sex
    }
    P.prototype.getSex = function() {
        return _sex
    }
    return P
})()
console.log(new Person('aa', 12)

使用Symbol来实现

let Person = (function() {
    let _sex = Symbol('sex');    //通过Symbol实现唯一性
    let P = function(name, sex) {
        this.name = name;
        this[_sex] = sex
    }
    P.prototype.getSex = function() {
        return this[_sex]
    }
    return P

})()
console.log(new Person('aa', 12))

 4、promise对象

Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过Promise构造函数来实例化

Promise对象内部会维护一个状态

默认是:pending
成功:resolved
失败:rejected

Promise对象下有一个方法:then,该方法在Promise对象的状态发生改变的时候触发then的回调,如果发生异常会捕获异常到catch中

两个原型方法

Promise.prototype.then()       Promise.prototype.catch()

两个常用的静态方法

Promise.all()          Promise.resolve()

Promise.all的用法

let fn = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve('ok')
            reject('no')
        }, 3000)
    })
}

//调用
fn().then(res => {    //resolve后会被调用
    console.log(res)
}).catch(err => {    //reject后会被调用
    console.log('err', err)
}).finally(() => {    //最终都会被调用
    console.log(arguments)
})

Promise.resolve的三种用法

let fn = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('ok')
            // reject('no')
        }, 3000)
    })
}

//用法一
Promise.resolve(fn()).then(res => {
    console.log(res)
}).catch(err => {
    console.log('err', err)
})

//用法二
Promise.resolve({
    then(resolve, reject) {
        setTimeout(() => {
            resolve('haha')
        }, 3000)
    }
}).then(res => {
    console.log('method2', res)
})

//用法三
Promise.resolve('str').then(res => {
    console.log(res)
})

 promise延伸

let fn = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('ok')
            // reject('no')
        }, 3000)
    })
}

fn().then(res => {
    console.log(1)
    return Promise.reject()
}, err =>{
    console.log(2)
}).then(res => {
    console.log(3)
}, err => {
    console.log(4)
return Promise.reject()
}).then(res => {
    console.log(5)
}, err => {
    console.log(6)
})
//通常来讲会依次执行下去,每一层的then依赖底层自动返回的new Promise对象,即使第一层失败,那么到第二层的时候是成功的
//如果需要返回失败,就需要在每一层阻断用return Promise.reject(),catch也和then一样,返回一个resolve对象的promise对象

promise对象初始化实现连调的写法

new Promise((resolve, reject) => {
    let chain = Promise.resolve()
    chain = chain.then(() => {
    throw new Error('this is second')
    })
    chain = chain.then(() => {
    console.log('this is first')
    })
    chain.catch((err) => {
    throw err
    })
})

5、generator函数

  在形式上,Generator是一个普通的函数,但是有两个特征,一是,function命令与函数名之间有一个星号, 二是,function函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态;

  generator返回一个迭代函数,调用next方法才能执行generator函数中的每一个yield

<script>
    let fn = () => {    //异步函数
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(100)
            }, 3000)
        })
    }

    let gFn = function* (){  //generator函数
        console.log(1)
        let res = yield fn()
        console.log(res)
        console.log(3)
    }

    //在generator函数中,需要其执行,需要先调用一次gFn.next(), 这个时候就会返回一个{value, done}的对象,value表示函数执行后的返回值,而done表示是否执行完成,再次调用的时候,把返回值value对象通过fn.next进行回传,那么在函数内部的yield就可以收到对应的结果了
    let exe = callBack => {        //自主封装的执行generator函数的方法
        let fn = callBack();    //需要保存的句柄
        
        let next = data => {
            let {value, done} = fn.next(data);
            if(done) return;
            value.then(res => {
                next(res)
            })

        }

        next()
    }

    exe(gFn)
</script>

 

 

posted on 2018-12-03 00:44  even_blogs  阅读(188)  评论(0编辑  收藏  举报