En Javascript podemos definir cualquier variable como un objeto declarándola con new (NO se recomienda) o creando un literal object (usando notación JSON). Ejemplo con new (no recomendado):
let alumno = new Object()
alumno.nombre = 'Carlos' // se crea la propiedad 'nombre' y se le asigna un valor
alumno['apellidos'] = 'Pérez Ortiz' // se crea la propiedad 'apellidos'
alumno.edad = 19
Creando un literal object (es la forma recomendada) el ejemplo anterior sería:
let alumno = {
nombre: 'Carlos',
apellidos: 'Pérez Ortiz',
edad: 19,
};
Podemos acceder a las propiedades con .
(punto) o [ ]
:
console.log(alumno.nombre) // imprime 'Carlos'
console.log(alumno['nombre']) // imprime 'Carlos'
let prop = 'nombre'
console.log(alumno[prop]) // imprime 'Carlos'
Si intentamos acceder a propiedades que no existen no se produce un error, se devuelve undefined:
console.log(alumno.ciclo) // muestra undefined
Sin embargo se genera un error si intentamos acceder a propiedades de algo que no es un objeto:
console.log(alumno.ciclo) // muestra undefined
console.log(alumno.ciclo.descrip) // se genera un ERROR
Para evitar ese error antes había que comprobar que existan las propiedades previas:
console.log(alumno.ciclo && alumno.ciclo.descrip)
// si alumno.ciclo es un objeto muestra el valor de
// alumno.ciclo.descrip y si no muestra undefined
Con ES2020 (ES11) se ha incluido el operador de encadenamiento opcional ?. para evitar tener que comprobar esto nosotros:
console.log(alumno.ciclo?.descrip)
// si alumno.ciclo es un objeto muestra el valor de
// alumno.ciclo.descrip y si no muestra undefined
Podremos recorrer las propiedades de un objecto con for..in
:
for (let prop in alumno) {
console.log(prop + ': ' + alumno[prop])
}
Si el valor de una propiedad es el valor de una variable que se llama como la propiedad no es necesario ponerlo:
let nombre = 'Carlos'
let alumno = {
nombre, // es equivalente a nombre: nombre
apellidos: 'Pérez Ortiz',
...
Una propiedad de un objeto puede ser una función:
alumno.getInfo = function() {
return 'El alumno ' + this.nombre + ' ' + this.apellidos + ' tiene ' + this.edad + 'años'
}
También podemos ponerlo con sintaxis arrow function:
alumno.getInfo = () => 'El alumno ' + this.nombre + ' ' + this.apellidos + ' tiene ' + this.edad + 'años'
Y para llamarlo se hace como con cualquier otra propiedad:
console.log(alumno.getInfo()) // imprime 'El alumno Carlos Pérez Ortíz tiene 19 años'
EJERCICIO: Crea un objeto llamado tvSamsung con las propiedades nombre (“TV Samsung 42”), categoria (“Televisores”), unidades (4), precio (345.95) y con un método llamado importe que devuelve el valor total de las unidades (nº de unidades * precio)