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)部使用的方法拨黔。