En este último ejercicio vamos a trabajar con clases en Javascript, para ello vamos a crear una clase denominada Peliculas, que englobará tanto propiedades como métodos, y será una pequeña aplicación para mostrar información acerca de películas. Veamos lo que va a contener dicha clase:
- La clase recibirá un objeto al momento de instanciarse con los siguientes datos:
- id de la película en IMDB
- Título
- Director
- Año de estreno
- País de origen
- Género
- Calificación
- Todos los datos del objeto son obligatorios
- Hay que validar que el IMDB tenga 9 caracteres, los 2 primeros son letras y el resto números
- El título no debe rebasar los 100 caracteres
- El director no debe rebasar los 50 caracteres
- El año de estreno es un número entero de 4 dígitos
- El país o países son introducidos en forma de array
- Los géneros, igualmente introducidos en forma de array
- Dichos géneros deben estar dentro de los géneros aceptados
- Crear método estático que devuelva los géneros aceptados
- La calificación sea un número entre 1 y 10, pudiendo ser decimal de una posición
- Método que devuelva toda la ficha técnica de la película
- A partir de un array con la información de 3 películas, generar 3 instancias de la clase de forma automatizada, e imprimir la ficha técnica de cada película
Los géneros aceptados son los siguientes: Action, Adult, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Film Noir, Game-Show, History, Horror, Musical, Music, Mystery, News, Reality-TV, Romance, Sci-Fi, Short, Sport, Talk-Show, Thriller, War, Western
Este es el ejm completo
Ejm
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Clase Películas</title>
</head>
<body>
<h1>Clase Películas</h1>
<script>
class Pelicula {
constructor({
id,
titulo,
director,
estreno,
pais,
generos,
calificacion,
}) {
this.id = id;
this.titulo = titulo;
this.director = director;
this.estreno = estreno;
this.pais = pais;
this.generos = generos;
this.calificacion = calificacion;
this.validarIMDB(id);
this.validarTitulo(titulo);
this.validarDirector(director);
this.validarEstreno(estreno);
this.validarPais(pais);
this.validarGeneros(generos);
this.validarCalificacion(calificacion);
}
// Atributo estático obtenedor
static get listaGeneros() {
return [
"Action",
"Adult",
"Adventure",
"Animation",
"Biography",
"Comedy",
"Crime",
"Documentary",
"Drama",
"Family",
"Fantasy",
"Film Noir",
"Game-Show",
"History",
"Horror",
"Musical",
"Music",
"Mystery",
"News",
"Reality-TV",
"Romance",
"Sci-Fi",
"Short",
"Sport",
"Talk-Show",
"Thriller",
"War",
"Western",
];
}
// Método estático que consume el atributo estático listaGeneros
static generosAceptados() {
return console.log(
`Los géneros aceptados son: ${Pelicula.listaGeneros.join(", ")}`
);
}
// Función que valida cadenas
validarCadena(propiedad, valor) {
if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);
if (typeof valor !== "string")
return console.log(
`${propiedad} "${valor}" ingresado no es una cadena de texto`
);
// Si todo va bien le decimos que es true (todo ok)
return true;
}
// Función que valida cadena y longitud de la misma
validarLongitudCadena(propiedad, valor, longitud) {
if (valor.length > longitud)
return console.log(
`${propiedad} "${valor}" excede el número de caracteres permitidos (${longitud}).`
);
// Si todo va bien le decimos que es true (todo ok)
return true;
}
// Función para validar número
validarNumero(propiedad, valor) {
if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);
if (typeof valor !== "number")
return console.log(
`${propiedad} "${valor}" ingresado no es un número`
);
// Si todo ok, devuelve true
return true;
}
// Función que valida arrays
validarArray(propiedad, valor) {
if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);
if (!(valor instanceof Array))
return console.log(
`${propiedad} "${valor}" ingresado no es un array`
);
if (valor.length === 0)
return console.log(`${propiedad} "${valor}" no tiene datos`);
for (let cadena of valor) {
if (typeof cadena !== "string")
return console.log(
`El valor "${cadena}" ingresado no es una cadena de texto`
);
}
// Si todo ok, devuelve true
return true;
}
// Función que valida el IMDB
validarIMDB(id) {
if (this.validarCadena("IMDB id", id)) {
if (!/^([a-z]){2}([0-9]){7}$/.test(id)) {
return console.log(`IMDB id "${id}" no es válido, debe tener 9 caracteres
, los 2 primeros letras minúsculas, los 7 restantes números`);
}
}
}
// Función que valida el título
validarTitulo(titulo) {
if (this.validarCadena("Título", titulo)) {
this.validarLongitudCadena("Título", titulo, 100);
}
}
// Función que valida el director
validarDirector(director) {
if (this.validarCadena("Director", director)) {
this.validarLongitudCadena("Director", director, 50);
}
}
// Función que valida un dígito de 4 dígitos
validarEstreno(estreno) {
if (this.validarNumero("Año de estreno", estreno)) {
if (!/^([0-9]){4}$/.test(estreno)) {
return console.log(
`Año de estreno "${estreno}" no es válido, debe tener 4 dígitos.`
);
}
}
}
// Función que valida el país
validarPais(pais) {
this.validarArray("País", pais);
}
// Función que valida los géneros
validarGeneros(generos) {
if (this.validarArray("Géneros", generos)) {
for (let genero of generos) {
// console.log(genero, Pelicula.listaGeneros.includes(genero));
if (!Pelicula.listaGeneros.includes(genero)) {
console.log(`Género(s) incorrecto(s) "${generos.join(", ")}"`);
Pelicula.generosAceptados();
}
}
}
}
// Función que valida la calificación
validarCalificacion(calificacion) {
if (this.validarNumero("Calificación", calificacion)) {
return calificacion < 0 || calificacion > 10
? console.log(
"La calificación tiene que estar en un rango entre 0 y 10"
)
: (this.calificacion = calificacion.toFixed(1));
}
}
// Función que muestra la ficha técnica de una película
fichaTecnica() {
console.log(
`Ficha técnica:\nTítulo: ${this.titulo}\nDirector: ${
this.director
}\nAño: ${this.estreno}\nPaís: ${this.pais.join(
" - "
)}\nGéneros: ${this.generos.join(", ")}\nCalificación: ${
this.calificacion
}\nIMDB id: ${this.id}`
);
}
}
// Pelicula.generosAceptados();
const pelicula = new Pelicula({
id: "tt1234567",
titulo: "Título de la película",
director: "Director de la película",
estreno: 1987,
pais: ["España", "Francia"],
generos: ["Sport", "Comedy"],
calificacion: 9,
});
pelicula.fichaTecnica();
const misPeliculas = [
{
id: "tt01234567",
titulo: "Mazapan",
director: "Almodovar",
estreno: 1984,
pais: ["España"],
generos: ["Horror"],
calificacion: 2,
id: "tt1234567",
},
{
id: "tt01234567",
titulo: "Hola",
director: "Almodovar",
estreno: 1984,
pais: ["España"],
generos: ["Horror"],
calificacion: 2,
id: "tt1234567",
},
{
id: "tt01234567",
titulo: "Adios",
director: "Almodovar",
estreno: 1984,
pais: ["España"],
generos: ["Horror"],
calificacion: 2,
id: "tt1234567",
},
];
misPeliculas.forEach((el) => new Pelicula(el).fichaTecnica());
</script>
</body>
</html>
