es6 promise&&class

意识上传
• 阅读 1097

ES6 Promise&&class
promise对象用于表示一个异步操作的最终状态(完成或失败)
以及其返回的值
同步?异步?
同步任务会阻塞程序执行(alert,for)
异步任务不会阻塞执行(setTimeout,fs.readFile)
主要知识点:

使用promise(then,catch,finally)
Promise.all & Promise.race
Promise.resolve & Promise.reject

方法,用于请求数据(模拟)

function f(cb){
    setTimeout(function(){
        cb && cb();
    },1000);
}
promise的三种状态
pending
fulfilled
rejected

状态的改变不可逆,一旦决议就不能再修改
e.g
页面中有个板块,需要多张图片记载完以后才显示

const loadImg = (src) =>{
    return new Promise ( resolve, reject) => {
        const img = new Image();
        image.src = src;
        img.onload = (){
            resolve(img);
        };
        img.onerror = (e){
            reject(e);
        };
    };
};
const imgs = [ url ];
Promise.all(imgs.map(src => loadImg(src))).then(arr) =>{//因为如果这里你直接绑定img的话返回的是img的连接而不是img的对象
    console.log(arr);
    arr.forEach(img)=>{
        document.body.appendChild(img);
    });
也可以改写成这样子
const promises = imgs.map(src){
    return loadImg(src);//loadImg由promise实例组成
});
Promise.all(promises).then(arr){
    console.log(arr);
    arr.forEach(img)=>{
        document.body.appendChild(img);
    });
});        

class
使用类可以降低维护成本
使用类可以使代码高度复用
扩充方便灵活(比如看不懂前面的人写的东西,但是可以直接继承+重写)
降低设计成本
使用简单

需要掌握:
类与对象
ES中类的特性
类的继承
Babel
基于流程控制的形变类实现
多态
ES5模仿类的继承

核心-封装
类所生产的就是对象

ES6中的类

class Car{
    //构造函数-工厂中街头人的作用
    //实例化 造车的过程=》类常见对象的过程
    constructor(…args){//构造函数固定的名字,调用的时候可以同时放入参数
        alert(args);//控制台是什么都没有的
    }
}
new Car(‘蓝色’,3);//实例化

面向对象基本特性:
多态(同一个接口,不同的表现),继承,封装

音乐播放器:

class AudioPlayer{
    this.songList=[];
    this.dom=null;
    this.status = 0;
    this.audio=new Audio();
    this.getSongs();
    this.createElement();
    this.bindEvents();
    this.render();
}
getSongs(){
    //…ajax
    this.songList=[
    {
        cover:’’,
        url:’mp3’,
        singer:{},
    }];
}
createElement(){
    const div = document.createElement(‘div’);
    div.innerHTML={`
        <div class=“btn”>播放</div>
        </div>`;
        this.dom = div;
    }
    bindEvents(){
        this.div.querySelector(‘.btn’).addEventListener(‘click’,()=>
            {
                console.log(“开始播饭“);
            });
    }
    render(){
        this.container.appendChild(this.dom);
    }
}
new AudioPlay(‘#app’);
    

静态属性,静态方法
1.不会被类实例所拥有的属性与方法,只是类自身拥有
2.只能通过类调用
3.静态方法和普通方法重名是没什么关系的

静态属性:Car.属性名 = 属性值;

类表达式:

//函数表达式
const a = function()}
}
//函数声明function a (){
}
//类表达式
const Person = class{
    constructor(){
    }
}

getter和setter
类似于给属性提供钩子
在获取属性值和设置属性值时做一些额外的事情

ES5中getter/setter

1.在对象字面量中写get/set方法
const ob ={
    _name:’’,
    get name(){
        return this._name;
    }
    set name(val){
        this._name = val;
    }
}
obj.name = 222;
2.Object.defineProperty
为我们的对象定一个属性
var obj = {
    _name:’’
};
Object.defineProperty(obj,’name’,{
    get:function(){
        
    }
    set:function(){
        
    }
});
console.log(obj);

ES6中?
class Person(){
    constructor(){
    this._name=‘’;
    }
    get name(){
        return ` ‘我的名字是${this._name}`;
    }
    set name(){
        this._name=val;
    }
}

name属性与new.target属性
如果类表达式的类有名字,则取类的名字
new.target指向new关键词后的类,用在构造函数的时候
可以去check有没有用new关键字调用
还有一种方法是 this instanceof 构造函数名字
构造函数的this和构造函数是有原型上的联系

在ES5中模拟类
//构造函数

⚠:js没有支持类的这个事情,只是模拟类
function Person(name,age){
    this.name = name;
    this.age = age;
}
new Person();

构造函数就是多一个new的关键字去调用
当使用new的话这个函数就会自动被当成构造函数调用
new调用的时候发生了什么呢?为什么会获得一个新的对象呢?
1.创建一个新的对象
2.把构造函数的prototype属性 作为空对象的原型
3.this赋值为这个空对象
4.执行函数
5.如果函数没有返回值 则返回this[返回之前这个空对象]
模拟类:
function Constructor(fn,args){

var _this = Object.create({fn.prototype);
var res =fn.apply(_this,args);
return res ? res: _this;

}
第三方库:
比如jquery
其实$(‘#menu’)就是走一个构造函数
但是在调用的时候并没有用new那么是怎么回事呢
它是先调用了一个内部函数,jQuery
里面会有一个new init的构造函数
ES6中class的继承
1.extends
在构造函数中的子类
子类要extends父类,然后再this赋值前要用super(),实际上就是调用父类的构造函数
constructor里要传递我们新的赋的this的东西
super关键字的作用
1.构造函数中进行调用
把this传给父类的构造函数,调用父类的函数
2.作为对象的方法调用

1.非静态方法访问super--》父类原型
比如说访问父类中eat的方法
super.eat
2.静态方法中访问super--》父类

多态
同一个接口,在不同的情况下做不同的事情
相同的接口 不同的表现
因为es6没有关键字支持多态

接口本身只是一组定义,实现都是在类里面
需要子类去实现的方法

class Human {
    say(){
        console.log(‘我是人’);
    }
}
class Man extends Human{
    say(){
        console.log(’我是小哥哥’);
    }
}
class Human {
    say(){
        console.log(‘我是小姐姐’);
    }
}
重载
class SimpleCalc{
    addCalc( …args){
        if(args.length ===0){
            return this.zero();
        }
        if(args.length===1){
            return this.onlyOneArgument(args);
        }
        return this.add(args0;
    }
    zero(){
        return 0;
    }
    onlyOneArgument(){
        return args[0];
    }
    add(args){
        return args.reduce((a,b)=>a+b,0);
    }
}

ES5中的继承
1.利用构造函数

function P(){
    this.name=‘parent’;
    this.say=function(){
        console.log(‘hahaha’);
    }
}
function c(){
    p.call(this);//传递到父类
    this.name = ‘child’;
    this.age = 11;
}
var child = new C();
child.say();

缺点:不能继承父类原型上的方法
prototype的方法
缺陷较大
解决方法:
C.prototype = new P();

Babel
Babel是一个js编译器
把浏览器不认识的代码转换成浏览器认识的

点赞
收藏
评论区
推荐文章
皮卡皮卡皮 皮卡皮卡皮
4年前
ajax
ajax定义:异步的JavaScript和XML是一种综合技术:运用了XMLHTTPRequest(xhr)和服务器交换数据,通过JavaScript局部渲染页面,从而实现异步的局部更新同步与异步同步代码按顺序执行,会阻塞代码执行(alert)异步不会阻塞代码XMLHTTPRequestxhrjsvarxhrnew
Wesley13 Wesley13
4年前
IO模型(BIO,NIO,AIO)及其区别
BIO:同步阻塞IONIO:同步非阻塞IOAIO:异步非阻塞IO先弄清楚同步、异步,阻塞、非阻塞概念。io操作分为两部分,发起io请求,和io数据读写。阻塞、非阻塞主要是针对线程发起io请求后,是否立即返回来定义的,立即返回称为非阻塞io,否则称为阻塞io。同步、异步主要针对io数据读写来定义的,读写数据过程中不阻塞线程称为异步io
Wesley13 Wesley13
4年前
IO模型详解及应用
如何阅读这篇文章顺序1.1:了解同步异步和阻塞非阻塞    1.11:同步异步    1.12:阻塞非阻塞1.2:了解一次read操作需要的步骤1.3:五种模型1.1:I/O模型中的同步异步,阻塞非阻塞:1.11:同步和异步:synchronous,asyncronous
Stella981 Stella981
4年前
Linux网络IO模型
同步和异步,阻塞和非阻塞_同步和异步_关注的是结果消息的通信机制同步:同步的意思就是调用方需要主动等待结果的返回异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。_阻塞和非阻塞_主要关注的是等待结果返回调用方的状态阻塞:是指
Easter79 Easter79
4年前
Spring注解@Scheduled 多线程异步执行
一、前言:Spring定时任务@Schedule的使用方式,默认是单线程同步执行的,启动过程是一个单线程同步启动过程,一旦中途被阻塞,会导致整个启动过程阻塞,其余的定时任务都不会启动。二、@Schedule注解多线程的实现:多个定时任务的执行,通过使用@Async注解来实现多线程异步调用。@Scheduled(
Stella981 Stella981
4年前
PHP 使用 Swoole
<p在一般的Server程序中都会有一些耗时的任务,比如:发送邮件、聊天服务器发送广播等。如果我们采用同步阻塞的防水去执行这些任务,那么这肯定会非常的慢。</p<pSwoole的TaskWorker进程池可以用来执行一些异步的任务,而且不会影响接下来的任务,很适合处理以上场景。</p<p那么什么是异步任务呢?</p<p可以从下面
Stella981 Stella981
4年前
Event事件
07.07自我总结Event事件一.导入模块fromthreadingimportEvent二.概念线程间状态同步:即将一个任务丢到子进程中,这个任务将异步执行,如何获取到这个任务的执行状态注意:执行状态和执行结果不是同一个概念,异步回调拿到的是任务
Stella981 Stella981
4年前
Netty学习之IO模型
目录1.1同步、异步、阻塞、非阻塞  同步VS异步    同步    异步  阻塞VS非阻塞    阻塞    非阻塞  举例    1)同步阻塞    2)同步非阻塞    3)异步阻塞    4)异步非阻塞1.2Li
Stella981 Stella981
4年前
Linux的五种IO模型?
IO的同步、异步、阻塞、非阻塞同步、异步同步(synchronous):A调用B,B立刻处理A的请求(即使C紧接着调用B),并把最终结果返回给A。异步(asynchronous):A调用B,B立刻反馈A,仅是状态,并非最终结果。B处
Stella981 Stella981
4年前
Python异步Web编程
!(https://oscimg.oschina.net/oscnet/c170345b07b2bf0b8c076ee4350fe145ad0.jpg)异步编程适用于那些频繁读写文件和频繁与服务器交互数据的任务,异步程序以非阻塞的方式执行I/O操作。这样意味着程序可以在等待客户机返回数据的同时执行其他任务,而不是无所事事的等待,浪费资源和时间。
Wesley13 Wesley13
4年前
Java BIO
同步与异步,阻塞与非阻塞同步:当前线程发起了一个调用或请求,然后当前线程需要等待该调用结束返回结果才能继续往下进行其他操作。异步:当前线程发起了一个调用或请求,然后当前线程不需等待调用的执行结果就可以继续往下执行(请求交由另一个线程去执行),之后可以通过被调用者的状态改变或者被调用者主动发出通知来获得执行结果