This document discusses exploring ES6 features including classes, modules, arrow functions, template literals, destructuring, iterators, generators, and proxies. It provides code examples of implementing classes, modules, and other features in ES5 syntax compared to the cleaner ES6 syntax. It also discusses setting up a development environment with Node.js, npm, and Babel to use ES6 features and introduces more advanced topics like proxies and generators.
14. Modules
// es6
// export
export requestAnimationFrame
export cancelAnimationFrame
// import
import { requestAnimationFrame as raf, cancelAnimationFrame as caf } from './animationFrame'
// export
export default React
// import
import React, { Component } from 'react'
15. Arrow functions
()=>{}
Identifier => Expression
// ES5
var total = values.reduce(function (a, b) {
return a + b;
}, 0);
// ES6
var total = values.reduce((a, b) => a + b, 0);
22. Iterator
// for in (not recommended)
for (var index in values) {
console.log(values[index])
}
// for of
for (var value of values) {
console.log(value)
}
24. Iterator
class RangeIterator {
constructor(start, stop) {
this.value = start
this.stop = stop
}
[Symbol.iterator]() { return this; }
next() {
var value = this.value
if (value < this.stop) {
this.value++
return {done: false, value: value}
} else {
return {done: true, value: undefined}
}
}
}
function range(start, stop) {
return new RangeIterator(start, stop)
}
25. Generator
function* range(start, stop) {
for (var i = start; i < stop; i++)
yield i
}
Generators are iterators.
All generators have a built-in implementation of .next()
and Symbol.iterator.
27. Generator
function fetch(url) {
request(url, function(response){
it.next(response)
})
}
function *main() {
var result1 = yield fetch('/api/user/~me')
var result2 = yield request('/api/statuses/' + result1.id )
}
var it = main()
it.next()
28. Generator
function runGenerator(g) {
var it = g(), ret
(function iterate(val){
ret = it.next( val )
if (!ret.done) {
if ('then' in ret.value) {
ret.value.then( iterate )
}
else {
setTimeout( function(){
iterate( ret.value )
}, 0 )
}
}
})()
}
30. Proxy
setter/getter in ES5
// ES5
var person = {}
Object.defineProperty(person, 'age', {
set: function(value) {
if (value > 200) {
throw new RangeError('seems invalid')
}
}
})
31. Proxy
setter/getter, the different way
let validator = {
set(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('The age is not an integer')
}
if (value > 200) {
throw new RangeError('The age seems invalid')
}
}
// The default behavior to store the value
obj[prop] = value
}
}
let person = new Proxy({}, validator)