Clases, Módulos y Generadores
Clase 5 de 14 • Curso de ECMAScript 6+
Contenido del curso
Las siguientes características de ES6 que aprenderás son: sintaxis de clases, módulos y generadores.
Clases en JavaScript
La palabra reservada class es una forma para crear clases y manejar la herencia en JavaScript, permitiendo resolver problemas con el paradigma de programación orientada a objetos (POO).
La estructura de clases en JavaScript consiste en:
- Definir la clase con la palabra reservada
class, seguido del nombre (por convención se empieza con mayúscula). - La función constructora sirve para crear las variables necesarias en la instancia del objeto.
- Para definir atributos necesitas el contexto
this, que representa la instancia del objeto. - Métodos para definir las acciones de la clase.
- Para crear una instancia, deberás declarar una variable e invocar la clase con la palabra reservada
new.
class Calculator {
constructor() {
this.valueA = 0
this.valueB = 0
}
suma(num1, num2){
this.valueA = num1
this.valueB = num2
return this.valueA + this.valueB
}
}
// Instancia
const calculadora = new Calculator()
calculadora.suma(2,2) //4
Módulos ECMAScript
Para que JavaScript sea más ordenada, legible y mantenible; ES6 introduce una forma de compartir código entre los archivos de manera modular. Esto involucra exportar funciones o variables de un archivo, e importarlas en otros archivos donde se necesite.
Para explicar cómo funciona las exportaciones e importaciones de código, debes tener mínimo dos archivos, uno para exportar las funcionalidades y otro que las importe para ejecutarlas.
Qué son las exportaciones de código
Las exportaciones de código consisten en crear funciones o variables para utilizarlas en otros archivos mediante la palabra reservada export. Existen dos formas de exportar, antes de declarar la funcionalidad, o entre llaves {}.
Por ejemplo, en el archivo math_function.js declaramos una función para sumar dos valores, el cual lo exportaremos.
//math_function.js
export const add = (x,y) => {
return x + y
}
//math_function.js
const add = (x,y) => {
return x + y
}
export { add, otherFunction, ... }
Importaciones de código
Las importaciones de código consiste en usar funciones o variables de otros archivos mediante la palabra reservada import, que deberán estar siempre lo más arriba del archivo y utilizando el mismo nombre que el archivo original. Existen dos formas de exportar, antes de declarar la funcionalidad, o entre llaves {}.
Por ejemplo, importamos la función add del archivo math_function.js para utilizarla en un archivo main.js.
// main.js
import { add, otherFunction } from './math_functions.js'
add(2,2) //4
Si importamos el módulo con un nombre diferente, existirá un error de sintaxis.
// Erróneo
import { suma } from './math_functions.js'
suma(2,2) //SyntaxError: The requested module '/src/archivo1.js' does not provide an export named 'suma'
Para importar todas las funcionalidades de un archivo se utiliza un asterisco (*) y se puede cambiar el nombre para evitar la repetición de variables o funciones a través de la palabra reservada as.
// main.js
import * as myMathModule from './math_functions.js';
myMathModule.add(2,2) //4
myMathModule.otherFunction()
...
Exportaciones por defecto
Si solo UN valor será exportado, entonces se puede utilizar export default. De esta manera no es necesario las llaves {} al exportar e importar.
//math_function.js
export default function add (x,y){
return x + y;
}
Adicionalmente, no se puede usar export default antes de declaraciones const, let o var, pero puedes exportarlas al final.
//Erróneo
export default const add = (x,y) => {
return x + y;
}
//Correcto
const add = (x,y) => {
return x + y;
}
export default add
Importaciones por defecto
Si únicamente UN valor será impotado, entonces se puede utilizar cualquier nombre en la importación. De esta manera no es necesario las llaves {}.
//Las siguientes importaciones son válidas
import add from './math_functions.js'
import suma from './math_functions.js'
import cualquierNombre from './math_functions.js'
Sin embargo, es recomendable utilizar siempre el nombre de la función, para evitar confusiones.
Combinar ambos tipos de exportaciones e importaciones
Teniendo las consideraciones de importaciones y exportaciones, nombradas y por defecto, entonces podemos combinarlas en un mismo archivo.
// module.js
export const myExport = "hola"
function myFunction() { ... }
export default myFunction
// main.js
import myFunction, { myExport } from "/module.js"
Generadores
Los generadores son funciones que devuelven solamente valor en cada invocación.
Su sintaxis es la siguiente:
- La palabra reservada
function*(con el asterisco al final). - La palabra reservada
yieldque hace referencia al valor retornado cada vez que se invoque, recordando el valor anterior. - Crear una variable a partir de la función generadora.
- El método
nextdevuelve un objeto que contiene una propiedadvaluecon cada valor deyield; y otra propiedaddonecon el valortrueofalsesi el generador ha terminado.
Si el generador se lo invoca y ha retornado todos sus valores de yield, entonces devolverá el objeto con las propiedades value con undefined y un done con true.
// Declaración
function* nombre(parámetros){
yield (primer valor retornado)
yield (segundo valor retornado)
...
yield (último valor retornado)
}
//Crear el generador
const generador = nombre(argumentos)
// Invocacioens
generador.next().value //primer valor retornado
generador.next().value //segundo valor retornado
...
generador.next().value //último valor retornado
Por ejemplo, creemos un generador para retornar tres valores.
function* generator(){
yield 1
yield 2
yield 3
}
const generador = generator()
generador.next().value //1
generador.next().value //2
generador.next().value //3
generador.next() // {value: undefined, done: true}
Contribución creada por Andrés Guano.