Clase 6 - Objetos en JavaScript
#object
#javaScript
#spread-operator
#rest-operator
#destructuring
Clases y constructores
Clases
- Brindan un modelo o molde para trabajar.
- No nos hablan de un escenario o elemento en particular.
- Se centran en decir qué propiedad tendrá nuestro molde
Constructores
- Un constructor nos permite instanciar cada uno de nuestros objetos.
- Son muy parecidos a las funciones, pero se comportan de manera muy distinta.
- Instanciar un objeto se refiere a la acción de crear un nuevo objeto a partir de una clase.
class Pet { constructor(name, specie, color, age) { this.name = name; this.specie = 'Dog'; this.color = 'Black'; this.age = 14; }}
const myDog = new Pet('Puki', 'Dog', 'Black', 14);const myCat = new Pet('Michi', 'Cat', 'White', 2);console.log(myCat);console.log('--------------------');console.log(myDog.color);Resumen
- Las CLASES funcionan como moldes de los cuales puedo crear objetos.
- Un OBJETO o instanciación de un objeto se crea a partir de una clase (nuestro molde).
class Pet { constructor(name, specie, color, breed) { this.name = name; this.specie = specie; this.color = color; this.breed = breed; }}
const cat = new Cat('Pelusa', 'gato', 'Naranja', 'raza naranja');
// Ahora necesito crear un dueño para mi mascotaclass Owner { constructor(name, address, phone, pet) { this.name = name; this.address = address; this.phone = phone; this.pet = pet; }}
const myDog = new Pet('Firulais', 'callejero', 9);const myCat = new Pet('Haru', 'GatoNegro', 4, 'negro');
const jaimito = new Owner('Jaimito Rodolfo', 'Calle 123', '123456', [ myDog, myCat,]);
// EJEMPLO CON USO DE MÉTODOS Y ATRIBUTOS PRIVADOS Y ESTÁTICOSclass Pet { #name; static category = 'animal';
constructor(name, specie, color, breed, size) { this.#name = name; this.specie = specie; this.color = color; this.breed = breed; }
#getSecretName() { // Método privado return `El nombre secreto es ${this.#name}`; }
revealSecret() { return this.#getSecretName(); // Se puede llamar dentro de la misma clase }
set setName(newName) { this.#name = newName; }
get name() { return this.#name; }
talk() { console.log(`${this.#name} hace ruido`); }
static patas() { console.log('tiene 4 patas'); }}
const myCat = new Pet('Michi', 'Cat', 'White', 'halfblood', 'small');myCat.name; // Asi funciona el geter, sin paréntesismyCat.setName = 'Pelusa'; // El seter funciona con el igual sin necesidad de los paréntesis
Pet.category; // Atributo estáticoPet.patas(); // Método estáticomyCat.talk(); // Método de instancia que hace uso de un atributo privado como #namemyCat.revealSecret(); //Método de instancia que hace uso de un método privado como #getSecretNameObjetos literales
- Es una de las formas más usadas para definir un objeto en JavaScript.
const myCat = { name: 'Haru', color: 'Negro', age: { value: 4, name: 'years' }, getInfo: () => { console.log(this.name) // no funciona porque la funcion flecha no tiene su propio this } getInfo() { console.log(this.name); // Ahora sí accede correctamente a `name` }, get info() { console.log(this.name) }, set setName(newName) { this.name = newName }
}
console.log(myCat)console.log(myCat.color)Built-in Objects
- En JavaScript hay objetos que existen por defecto y los podemos utilizar. Entre ellos podemos encontrar:
- Array, Number, Date, Boolean, String, Math, Set, etc…
- Estos objetos poseen propiedades y métodos ESTÁTICOS a los cuales podemos acceder y de esa forma utilizarlos en nuestro código. Por ejemplo:
Math.PI=> nos devuelve el valor del número Pi (3.14159…)Math.max(n1,n2,n3,...,nx)=> nos devuelve el máximo número de todos los argumentos que le pasemos al método
Static methods
- Podemos declarar un método o propiedad como STATIC.
- Al hacerlo dicho método o propiedad puede ser utilizada sin la necesidad de tener una instancia de la clase (es decir un objeto creado a partir de nuestra clase)
- Para utilizarlo simplemente agregamos la palabra reservada STATIC antes del nombre del método o propiedad correspondiente.
class Calculadora { static algo = 555; constructor(valorInicial = 0) { this.resultado = valorInicial; }
sumar(valor) { return (this.resultado += valor); } restar(valor) { return (this.resultado -= valor); }
static sumar(a, b) { return a + b; } static restar(a, b) { return a - b; }}const miCalc = new Calculadora(10);miCalc.sumar(3);miCalc.restar(1);console.log(Calculadora.restar(2, 1));Rest operator
- Es un operador de JavaScript que nos permite condensar el resto de variables o parámetros de una función en una sola variable.
- Es ampliamente usado para simplificar la declaración de variables cuando sea necesario.
- Para utilizarlo agregamos el operador (
...) delante del nombre de la variable donde queremos condensar el resto de valores
function sum(...numbers) { let result = 0; numbers.forEach((number) => (result += number)); return result;}console.log(sum(1, 2, 3, 4, 5)); // 15console.log(sum(10, 20)); // 30console.log(sum()); // 0Destructuring
- El destructuring nos permite extraer propiedades de un objeto de una forma más condensada.
- Nos sirve también para poder pasar argumentos a una función de una forma más cómoda.
- La mejor forma de ver su sintaxis (como utilizarlo) es con ejemplos:
// DESTRUCTURING EN OBJETOSconst person = { fullname: 'Juan Perez', age: 53}
// Sin destructuringconst age = person.ageconst fullname = person.fullname
// Con destructuringconst { age, fullname: personFullname } = person
// DESTRUCTURING EN FUNCIONESfunction sum(num1, num2) { reurn num1 + num2}
const result = sum(3, 17)
function sum({num1, num2}) { reurn num1 + num2}
const result = sum({num1: 3, num2: 17})
// DESTRUCTURING EN ARREGLOSconst scores = [1,2,3,4]const [first, second, ...restOfNumbers] = scores // hacemos uso del rest operator tambiénconsole.log(first)console.log(restOfNumbers)
// También se puede usar el destructuring junto al rest operator en objetosconst person = { fullname: 'Juan Perez', age: 53, address: 'calle 123'}const { age, ...rest } = personconsole.log(rest) // { fullname: 'Juan Perez', address: 'calle 123' }Spread operator
- Es un operador de JavaScript que nos permite esparcir (separar o extender) un arreglo u objeto.
- Al utilizarlo rompemos la estructura que tiene por defecto con el fin de obtener sus valores separados.
- Es útil cuando necesitamos pasar los elementos de un arreglo como si fueran argumentos independientes uno del otro.
- Un buen ejemplo es el método estático Math.max()
const scores = [12, 54, 0, 154, 28];
// Sin spread operatorfunction maxNumberOfFIveElements(numbers) { return Math.max(numbers[0], numbers[1], numbers[2], numbers[3], numbers[4]);}
const result = maxNumberOfFIveElements(scores);
// Con spread operatorfunction maxNumberOfArray(numbers) { return Math.max(...numbers);}
const result = maxNumberOfFIveElements(scores);- El spread operator (
...) en JavaScript se usa para copiar o expandir elementos de un iterable (como un array u objeto) en un nuevo contexto. - El rest operator (
...) se usa en la desestructuración para obtener el resto de las propiedades o elementos en una variable.
Ejercicios
- Resolver el siguiente ejercicio que estará dividido en cuatro partes
Primera parte
- Dado un array de libros, implementar una función filterBooksByAuthor( ) que reciba por parámetros dicho array y un string con el nombre de un autor, y devuelva un nuevo array con libros del autor indicado.
const books = [ { title: 'El Aleph', author: 'Jorge Luis Borges' }, { title: 'La ciudad y los perros', author: 'Mario Vargas Llosa' }, { title: 'Cien años de soledad', author: 'Gabriel García Márquez' }, { title: 'Rayuela', author: 'Julio Cortázar' }, { title: 'Ficciones', author: 'Jorge Luis Borges' }, { title: 'El hacedor', author: 'Jorge Luis Borges' }, { title: 'Los pasos perdidos', author: 'Alejo Carpentier' }, { title: 'El reino de este mundo', author: 'Alejo Carpentier' }, { title: 'La fiesta del chivo', author: 'Mario Vargas Llosa' }, { title: 'La tía Julia y el escribidor', author: 'Mario Vargas Llosa' }, { title: 'Crónica de una muerte anunciada', author: 'Gabriel García Márquez' }, { title: 'El amor en los tiempos del cólera', author: 'Gabriel García Márquez' }, { title: 'Bestiario', author: 'Julio Cortázar' }, { title: 'Las armas secretas', author: 'Julio Cortázar' }];
filter Books By Author(books, ‘Jorge Luis Borges’) return ==> [ { title: 'El Aleph', author: 'Jorge Luis Borges' }, { title: 'Ficciones', author: 'Jorge Luis Borges' }, { title: 'El hacedor', author: 'Jorge Luis Borges' }]Segunda parte
- A partir de lo realizado en la primera parte, utilizar la función para obtener todos los libros de un autor a elección, luego mediante métodos de array modificar el nombre del autor de todos los libros filtrados.
- Verificar que si se muestra en consola los libros filtrados se verá el autor modificado. ¿Qué sucede si se muestra en consola el array original?
Tercera parte
- Modificar la función de la primera parte para que ahora funcione si mando el nombre completo del autor, o solo su apellido (mejorar el filtro). Por ejemplo, la función debe devolver lo siguiente, ya sea si le mando
‘Jorge Luis Borges’o‘Borges’:
return ==> [ { title: 'El Aleph', author: 'Jorge Luis Borges' }, { title: 'Ficciones', author: 'Jorge Luis Borges' }, { title: 'El hacedor', author: 'Jorge Luis Borges' }]Cuarta parte
- Teniendo en cuenta lo observado en la segunda parte, corregir ese comportamiento de la forma que considere apropiada