Objetos en Javascript
Published: 2022-02-07 17:06:48

Un objeto en JavaScript es un contenedor de propiedades, donde una propiedad tiene un nombre y un valor. 

## Objeto literal

```jsx
const producto = { 
	nombre  : "Monitor" ,
	precio :  300,
	disponible : true, 
}
```

Pero a partir de la version ES6 de Javascript podriamos hacerlo :

```jsx
const nombre = "Manuel"
const apellido = "Garcia"
const padre = {
	nombre : "Jose",
	edad: 58
}
const alumno = {nombre,apellido,padre}
console.log(alumno) 
```

Acceder a los valores de un objeto

```jsx
//acceder a los valores de un objeto 
producto.nombre
producto['nombre'] 

```

 Agregar propiedades de un objeto

```jsx
producto.imagen = "imagen.jpg" 
producto['imagen'] = "imagen.jpg"
```

Eliminar propiedades del objeto

```jsx
delete producto.disponible
```

 Destructuring de objetos

```jsx
const nombre = producto.nombre //antes
const {nombre , precio} = producto //es6
```

Objetos dentro de objetos

```jsx
producto.informacion = {
	peso:'1kg',
	medida : '1nm'
}
producto.informacion.fabricacion = {
	pais : 'china'
}

```
Destructuring de objetos anidados

```jsx
const { informacion : {fabricacion : {pais} }  } = producto 
```

## El problema con los objetos:

Aunque este declarado como const sus propiedades se pueden modificar o eliminar.

```jsx
"use strict" 
```
Sirve para congelar un objeto y no poder modificarlo , nos va exigir cumplir buenas practicas (habilita algunos metodos)

```jsx
Object.freeze(producto) 
// -> no agregar modificar ni eliminar objeto 

Object.seal (producto )
// -> no agregar ni eliminar , si modificar 
```

Unir objetos

```jsx
const producto = {
}
const medidas = {
} 
const resultado = Object.assign(producto,medidas)
//spread Operator
const resultado2 = {...producto , ... medidas }
```

Funciones en objetos y acceder a sus valores

```jsx
const nombre = "Juan"
const producto = {
	nombre : "Monitor",
	precio : 300,
	mostrarInfo: function () {
		console.log(`El producto es  ${nombre}`) 
}		
}// imprimira El producto es Juan 

// => la forma correcta: 
const producto = {
	nombre : "Monitor",
	precio : 300,
	mostrarInfo: function () {
		console.log(`El producto es  ${this.nombre}`) 
}		
}// imprimira El producto es Monitor 

//this refiere al objeto en si mismo 

producto.mostrarInfo()
```

Funciones constructoras (antes de ES6)

```jsx
function Producto(nombre, precio ) {
	this.nombre = nombre
	this.precio = precio  
	this.disponible = true
}
const producto2 = new Producto("Monitor" , 400 ) 
```

For ...in

```jsx

const automovil = {
    modelo : 'Camaro',
    year : 1969,
    motor : '6.0'
}

for (let propiedad in automovil ){
    console.log(propiedad)
    console.log(`${automovil[propiedad]}`)
}
```

For of

```jsx
for (let [llave,valor] of Object.entries(automovil)){
    console.log(llave, valor )
}
```

Metodos sobre objetos

```jsx
const producto = {
	nombre : "Monitor"
	precio : 300,
	disponible : true
}
console.log(Object.keys(producto))
console.log(Object.values(producto))
console.log(Object.entries(producto))

```

Object.keys():

Object.keys devuelve un array cuyos elementos son strings correspondientes a las propiedades enumerables que se encuentran directamente en el object. El orden de las propiedades es el mismo que se proporciona al iterar manualmente sobre las propiedades del objeto.

```jsx
const alumno = {
    nombre : "Manuel",
    apellido : "Garcia",
    edad : 21,
    hermanos : ["Juan","Maria","Pepe"],
    padre: {
        nombre:"Jose",
        edad:58
    }
}

console.log(Object.keys(alumno))
```

Object.values():

El método Object.values() devuelve un array con los valores correspondientes a las propiedades enumerables de un objeto

```jsx
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]

```

Object.assign():

El método se utiliza para copiar los valores de todas las propiedades propias enumerables de uno o más objetos de origen a un objeto de destino. Se devolverá el objeto de destino.

Úselo para asignar valores a un objeto existente:

```jsx
let user = {
    firstName: "John"
};

Object.assign(user, {lastName: "Doe", age:39});
console.log(user); // Logs: {firstName: "John", lastName: "Doe", age: 39}

```