馃 ES6 (ECMAScript 2015)

馃嵖 驴Qu茅 es ES6?

La ultima versi贸n de Node incluye soporte amplio de ES6. Se puede entonces empezar a escribir en c贸digo en esta versi贸n, lo que simplifica mucho de la sintaxis de Javascript y expande las caracter铆sticas del lenguaje, sin embargo esto es opcional.

Sin embargo al estar utilizando la sintaxis de ES6 del lado del navegador, no todas las opciones pueden estar disponibles. Para solucionar este problema existen soluciones como Babel, que convierte el c贸digo ES6 en c贸digo compatible con versiones anteriores que puedan ser interpretadas por otros navegadores.

馃嵖 驴C贸mo crear clases en ES6?

En ES6 lo primero que requerimos es indicarle que queremos utilizar ES6, para ello podemos empezar por decirle hasta la parte superior del c贸digo que deseamos que el scope de nuestro c贸digo sea estricto.

'use strict';

Ahora podemos crear nuestra clase Robot.

class Robot {
    constructor(nombre){
        this.nombre = nombre;
    }
}

La sintaxis como vemos es muy similar a la de otros lenguajes.

馃嵖 驴C贸mo se maneja el scope en ES6?

Una caracter铆stica de ES6, es la palabra let que nos permite definir el scope de una variable sin tener que hacer uso de var, as铆 que descontinuamos var en favor de let.

let genialo = new Robot('Genialo');

馃嵖 驴C贸mo definir m茅todos en ES6?

En ES6 no es necesario utilizar prototype para agregar m茅todos a una clase, se pueden agregar directamente sobre ella sin siquiera usar la palabra function.

class Robot {
    constructor(nombre){
        this.nombre = nombre;
    }
    saludar(){
        // ... saludar
    }
}

let genialo = new Robot('Genialo');
genialo.saludar();

馃嵖 驴Qu茅 son los string templates de ES6?

En ES6 no requerimos concatenar variables, podemos utilizar la nueva sintaxis de templates para imprimir cadenas largas sin tanto problema utilizando la sintaxis de tilde invertidas ````.

class Robot{
    constructor(nombre){
        this.nombre = nombre;
    }

    saludar(){
        console.log(`Hola, mi nombre es ${this.nombre}.`);
    }

    frente(){
        console.log(`${this.nombre} da dos pasos al frente.`);
    }

    atras(){
        console.log(`${this.nombre} da dos pasos atras.`);
    }

}

let genialo = new Robot('Genialo');
genialo.saludar();
genialo.frente();
genialo.atras();

馃嵖 Super

Al heredar directamente de clases no es necesario que invoquemos el m茅todo call, pero si requerimos que el constructor de la super clase se ejecute, podemos hacer uso de super().

class Robot{
    constructor(nombre){
        super();
        this.nombre = nombre;
    }
    // ...
}

馃嵖 ES6 Clases y Eventos

No es necesario utilizar util, ya que al usar clases el prop贸sito de esta queda cubierto por la herencia que proveen las clases como tales.

Podemos definir entonces los emit (emisores) y los eventos para genialo.

// Habilitar el modo estricto
'use strict';

let events = require('events');

class Robot extends events {

    constructor(nombre){
        super();
        this.nombre = nombre;
    }

    saludar(){
        console.log(`Hola, mi nombre es ${this.nombre}.`);
        this.emit('saludar');
    }

    frente(){
        console.log(`${this.nombre} camina al frente.`);
        this.emit('frente');
    }

    atras(){
        console.log(`${this.nombre} camina hacia atras.`);
        this.emit('atras');
    }

}

let genialo = new Robot('Genialo');

genialo.on('frente',function(){
    console.log(this.nombre + ' da dos pasos al frente');
});

genialo.on('atras',function(){
    console.log(this.nombre + ' da dos pasos atras');
});

genialo.saludar();
genialo.frente();
genialo.atras();

馃嵖 驴C贸mo utilizar clases como m贸dulos?

Por ultimo, es posible utilizar nuestra clase como m贸dulo y mandarla llamar como tal.

module.exports = class Robot extends events {
    // ....