es6 promise&&class

ES6 Promise&&class
promise對象用於表示一個異步操做的最終狀態(完成或失敗)
以及其返回的值
同步?異步?
同步任務會阻塞程序執行(alert,for)
異步任務不會阻塞執行(setTimeout,fs.readFile)
主要知識點:jquery

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

方法,用於請求數據(模擬)es6

function f(cb){
    setTimeout(function(){
        cb && cb();
    },1000);
}
promise的三種狀態
pending
fulfilled
rejected

狀態的改變不可逆,一旦決議就不能再修改
e.g
頁面中有個板塊,須要多張圖片記載完之後才顯示ajax

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
使用類能夠下降維護成本
使用類可使代碼高度複用
擴充方便靈活(好比看不懂前面的人寫的東西,可是能夠直接繼承+重寫)
下降設計成本
使用簡單promise

須要掌握:
類與對象
ES中類的特性
類的繼承
Babel
基於流程控制的形變類實現
多態
ES5模仿類的繼承瀏覽器

核心-封裝
類所生產的就是對象app

ES6中的類dom

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.靜態方法和普通方法重名是沒什麼關係的this

靜態屬性: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();

BabelBabel是一個js編譯器把瀏覽器不認識的代碼轉換成瀏覽器認識的

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息