Lesson-11 ES6 高級(jí)語(yǔ)法(2)

Promise

我覺(jué)得可以簡(jiǎn)單的把promise理解成一個(gè)擁有狀態(tài)的隊(duì)列,promise擁有三個(gè)狀態(tài)Pending(進(jìn)行中)理郑、Resolved(已完成告私,又稱Fulfilled)和Rejected(已失敗,只要狀態(tài)變?yōu)槭。筒粫?huì)在執(zhí)行后面的方法了

var promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

在執(zhí)行完上面的操作的時(shí)候 我們可以在后面添加 then 方法接受狀態(tài) then方法中的返回值可以成為下一個(gè) then函數(shù)的參數(shù)

promise.then(function(value) {
  // success
}, function(value) {
  // failure
});

那么我們發(fā)現(xiàn)并沒(méi)有隊(duì)列這么一說(shuō)啊 是的 promise 并不是真正的隊(duì)列 而是通過(guò)then 函數(shù) 每次返回的新的Promise對(duì)象 和 鏈?zhǔn)秸Z(yǔ)法形成一個(gè)隊(duì)列 然后可以通過(guò)catch函數(shù)同意捕獲錯(cuò)誤

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 處理前面三個(gè)Promise產(chǎn)生的錯(cuò)誤
});

還有可以通過(guò)all函數(shù)進(jìn)行打包况脆,Promise.all Promise.race 方法用于將多個(gè)Promise實(shí)例饭宾,包裝成一個(gè)新的Promise實(shí)例。如果所有Promise 都成功 則表示成功 否則失敗

// 生成一個(gè)Promise對(duì)象的數(shù)組
var promises = [2, 3, 5, 7, 11, 13].map(function(id){
  return getJSON("/post/" + id + ".json");
});

Promise.all(promises).then(function(posts) {
  // ...
}).catch(function(reason){
  // ...
});

Generator函數(shù)與Promise的結(jié)合

function getFoo () {
  return new Promise(function (resolve, reject){
    resolve('foo');
  });
}

var g = function* () {
  try {
    var foo = yield getFoo();
    console.log(foo);
  } catch (e) {
    console.log(e);
  }
};

function run (generator) {
  var it = generator();

  function go(result) {
    if (result.done) return result.value;

    return result.value.then(function (value) {
      return go(it.next(value));
    }, function (error) {
      return go(it.throw(value));
    });
  }

  go(it.next());
}

run(g);

Class

ES6提供了一種新的 類的寫法

class Point {
  constructor(){
    // ...
  }

  toString(){
    // ...
  }

  toValue(){
    // ...
  }
}

// 等同于

Point.prototype = {
  toString(){},
  toValue(){}
}

可以使用下面方法拓展類方法

class Point {
  constructor(){
    // ...
  }
}

Object.assign(Point.prototype, {
  toString(){},
  toValue(){}
})

新的構(gòu)造函數(shù)像下面這樣

//定義類
class Point {

  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '('+this.x+', '+this.y+')';
  }

}

var point = new Point(2, 3);

point.toString() // (2, 3)

point.hasOwnProperty('x') // true
point.hasOwnProperty('y') // true
point.hasOwnProperty('toString') // false
point.__proto__.hasOwnProperty('toString') // true

Class的繼承
使用extent繼承 能直接使用 super.method()

class ColorPoint extends Point {

  constructor(x, y, color) {
    super(x, y); // 調(diào)用父類的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 調(diào)用父類的toString()
  }

}

類的prototype屬性和proto屬性
在ES5中格了,每一個(gè)對(duì)象都有__proto__屬性看铆,指向?qū)?yīng)的構(gòu)造函數(shù)的prototype屬性。Class作為構(gòu)造函數(shù)的語(yǔ)法糖盛末,同時(shí)有prototype屬性和__proto__屬性性湿,因此同時(shí)存在兩條繼承鏈。

(1)子類的__proto__屬性满败,表示構(gòu)造函數(shù)的繼承肤频,總是指向父類。

(2)子類prototype屬性的__proto__屬性算墨,表示方法的繼承宵荒,總是指向父類的prototype屬性。

類還可以這么繼承

class A {
}

class B {
}

// B的實(shí)例繼承A的實(shí)例
Object.setPrototypeOf(B.prototype, A.prototype);

// B繼承A的靜態(tài)屬性
Object.setPrototypeOf(B, A);

類方法 或者叫 類的靜態(tài)方法

class Foo {
  static classMethod() {
    return 'hello';
  }
}

Foo.classMethod() // 'hello'

var foo = new Foo();
foo.classMethod()

屬性的getter and setter

class MyClass {
  constructor() {
    // ...
  }
  get prop() {
    return 'getter';
  }
  set prop(value) {
    console.log('setter: '+value);
  }
}

let inst = new MyClass();

inst.prop = 123;
// setter: 123

inst.prop
// 'getter'

Proxy

個(gè)人理解就是對(duì)類封裝净嘀,能夠捕獲對(duì)類的一些操作报咳,然后能夠進(jìn)行處理,有點(diǎn)類似監(jiān)聽

var handler = {
  get: function(target, name) {
    if (name === 'prototype') return Object.prototype;
    return 'Hello, '+ name;
  },
  apply: function(target, thisBinding, args) { return args[0]; },
  construct: function(target, args) { return args[1]; }
};

var fproxy = new Proxy(function(x,y) {
  return x+y;
},  handler);

fproxy(1,2); // 1
new fproxy(1,2); // 2
fproxy.prototype; // Object.prototype
fproxy.foo; // 'Hello, foo'

Reflect

個(gè)人理解是對(duì)類的一層簡(jiǎn)短封裝 實(shí)現(xiàn)一系列的功能

var obj = {
  get foo() { return this.bar(); },
  bar: function() { ... }
}

// 下面語(yǔ)句會(huì)讓 this.bar()
// 變成調(diào)用 wrapper.bar()
Reflect.get(obj, "foo", wrapper);

Symbol

Symbol是一種新的數(shù)據(jù)類型 其他幾種是 前七種是:數(shù)值挖藏、字符串暑刃、布爾值、數(shù)組膜眠、對(duì)象岩臣、函數(shù)、undefined宵膨。
可以把它作為屬性名

var mySymbol = Symbol();

// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';

// 第二種寫法
var a = {
  [mySymbol]: 'Hello!'
};

// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上寫法都得到同樣結(jié)果
a[mySymbol] // "Hello!"

Symbol作為屬性名架谎,該屬性不會(huì)出現(xiàn)在for...in、for...of循環(huán)中辟躏,也不會(huì)被Object.keys()
谷扣、Object.getOwnPropertyNames()
返回。但是捎琐,它也不是私有屬性会涎,有一個(gè)Object.getOwnPropertySymbols方法,可以獲取指定對(duì)象的所有Symbol屬性名瑞凑。
除了定義自己使用的Symbol值以外末秃,ES6還提供一些內(nèi)置的Symbol值,指向語(yǔ)言內(nèi)部使用的方法拨黔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛔溃,一起剝皮案震驚了整個(gè)濱河市绰沥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贺待,老刑警劉巖徽曲,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麸塞,居然都是意外死亡秃臣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門哪工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奥此,“玉大人,你說(shuō)我怎么就攤上這事雁比≈苫ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵偎捎,是天一觀的道長(zhǎng)蠢终。 經(jīng)常有香客問(wèn)我,道長(zhǎng)茴她,這世上最難降的妖魔是什么寻拂? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丈牢,結(jié)果婚禮上祭钉,老公的妹妹穿的比我還像新娘。我一直安慰自己己沛,他們只是感情好慌核,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泛粹,像睡著了一般遂铡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晶姊,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音伪货,去河邊找鬼们衙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碱呼,可吹牛的內(nèi)容都是我干的蒙挑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼愚臀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忆蚀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馋袜,失蹤者是張志新(化名)和其女友劉穎男旗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣鳖,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡察皇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泽台。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什荣。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怀酷,靈堂內(nèi)的尸體忽然破棺而出稻爬,到底是詐尸還是另有隱情,我是刑警寧澤蜕依,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布因篇,位于F島的核電站,受9級(jí)特大地震影響笔横,放射性物質(zhì)發(fā)生泄漏竞滓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一吹缔、第九天 我趴在偏房一處隱蔽的房頂上張望商佑。 院中可真熱鬧,春花似錦厢塘、人聲如沸茶没。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抓半。三九已至,卻和暖如春格嘁,著一層夾襖步出監(jiān)牢的瞬間笛求,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工糕簿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留探入,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓懂诗,卻偏偏與公主長(zhǎng)得像蜂嗽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殃恒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一植旧、let 和 constlet:變量聲明, const:只讀常量聲明(聲明的時(shí)候賦值)辱揭。 let 與 var 的...
    dadage456閱讀 757評(píng)論 0 0
  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop病附。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,697評(píng)論 0 5
  • class的基本用法 概述 JavaScript語(yǔ)言的傳統(tǒng)方法是通過(guò)構(gòu)造函數(shù)问窃,定義并生成新對(duì)象。下面是一個(gè)例子: ...
    呼呼哥閱讀 4,070評(píng)論 3 11
  • ES6特性歸納 ES的全稱是ECMAScript胖喳,它是JavaScript的規(guī)格泡躯,JS是ES的一種實(shí)現(xiàn)。ES還有J...
    FWHeart閱讀 560評(píng)論 0 4
  • 看這本書是在markdown在做的筆記丽焊,更友好的閱讀方式訪問(wèn): github es6.md(https://git...
    汪汪仙貝閱讀 446評(píng)論 0 0