ES6時代のJavaScript


@

WebES6JavaScriptES6Draft Rev31
JavaScriptはECMAScript(ECMA262)という仕様をもとに実装されています。
現在のモダンなWebブラウザはECMAScript 5.1th EditionをもとにしたJavaScript実行エンジンを搭載しています。
そして次のバージョンであるECMAScript 6th Editionが現在策定中で、略称としてES6という名前がよく使われます。

JavaScriptJavaScript

Class


JavaScriptOOPJavaRubyOOP使使npmclassES6
// ES5
'use strict';

function User(name){
  this._name = name;
}

User.prototype = Object.create(null, {
  constructor: {
    value: User
  },

  say: {
    value: function() {
      return 'My name is ' + this._name;
    }
  }
});

function Admin(name) {
  User.apply(this, arguments);
}

Admin.prototype = Object.create(User.prototype, {
  constructor: {
    value: Admin
  },

  say: {
    value: function() {
      var superClassPrototype =  Object.getPrototypeOf(this.constructor.prototype);
      return '[Administrator] ' + superClassPrototype.say.call(this);
    }
  }
});

var user = new User('Alice');
console.log(user.say()); // My name is Alice

var admin = new Admin('Bob');
console.log(admin.say()); // [Administrator] My name is Bob
// ES6
'use strict';

class User {
  constructor(name) {
    this._name = name;
  }

  say() {
    return 'My name is ' + this._name;
  }
}

class Admin extends User {
  say() {
    return '[Administrator] ' + super.say();
  }
}

var user = new User('Alice');
console.log(user.say()); // My name is Alice

var admin = new Admin('Bob');
console.log(admin.say()); // [Administrator] My name is Bob

Function Arguments


JavaScript使||使arguments使ES6
// ES5
'use strict';

function loop(func, count) {
  count = count || 3;
  for (var i = 0; i < count; i++) {
    func();
  }
}

function sum() {
  var result = 0;
  for (var i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
}

loop(function(){ console.log('hello')}); // hello hello hello
console.log(sum(1, 2, 3, 4)); // 10
// ES6
'use strict';

function loop(func, count = 3) {
  for (var i = 0; i < count; i++) {
    func();
  }
}

function sum(...numbers) {
  return numbers.reduce(function(a, b) { return a + b; });
}

loop(function(){ console.log('hello')}); // hello hello hello
console.log(sum(1, 2, 3, 4)); // 10

使ES6Destructuring and parameter handling in ECMAScript 6

Arrow Function


JavaScriptDOMXHRJavaScript(DOMXHR)this使thisFunction.prototype.bind使thisES6Arrow Function|this
// ES5
'use strict';

var ClickCounter = {
  _count: 0,

  start: function(selector) {
    var node = document.querySelector(selector);
    node.addEventListener('click', function(evt){
      this._count++;
    }.bind(this));
  }
};

ClickCounter.start('body');
// ES6
'use strict';

var ClickCounter = {
  _count: 0,

  start: function(selector) {
    var node = document.querySelector(selector);
    node.addEventListener('click', (evt)=>{
      this._count++;
    });
  }
};

ClickCounter.start('body');

Promise


XHR(setTimeoutsetInterval)(XHRWebWorker)(IndexedDB)

使使ES6Promise使PromisePromise
// ES5
'use strict';

function sleep(callback, msec) {
  setTimeout(callback, msec);
}

sleep(function(){
  console.log('wake!')
}, 1000);
// ES6
'use strict';

function sleep(msec) {
  return new Promise(function(resolve, reject){
    setTimeout(resolve, msec);
  });
}

sleep(1000).then(function(){
  console.log('wake!');
});

try-catchPromisePromiseWebJavaScript Promise

Generator


GeneratorJavaScript使GeneratorES6*1

Generator/(co-rutine)使

GeneratorPromisePromiseGenerator使GeneratorPromise使co使
// ES6
'use strict';

co(function*(){
  console.log('sleep...');
  yield sleep(1000);
  console.log('wake!');
});

co使co使async/awaitES7*2

GeneratorES6 Generator使async/await


JavaScriptES6ES6Modules, Symbol, Data Structures, Proxy, Template StringES6nodeES6ES5traceur-compiler6to5ES6ECMAScript compatibility table

ES6JavaScript

*1:Firefoxでは2006年ごろにはすでに実装されていました

*2:C#のasync/awaitと同様のもの