Un objecte és un un conjunt de valors que estan relacionats i que es gestionen com un conjunt.
Objecte
Pots crear un objecte directament tal com es mostra a continuació:
const mike: any = {}
En aquest cas l'objecte està buit.
Pots verificar que l'objecte no té una variable name
:
const mike = {}
console.log(mike.name) // undefined
Si vols, pots afegir una variable name
a l'objecte:
const mike: any = {}
mike.name = "Mike Smith"
console.log(mike) // { name: "Mike Smith", }
La sintaxis és la mateixa que utilitzes per definir una variable, excepte que dius que la variable name
està definida dins el context de la variable mike
.
Les variables d'un objecte és coneixen amb el nom de propietats de l'objecte, encara que a efectes pràctics no deixen se ser variables.
També pots definir les propietats de l'objecte al crear l'objecte tal com es mostra a continuació:
const mike: any = {
name: "Mike Smith",
email: "mike@gmail.com"
}
La diferència principal és que enlloc d'utilitzar =
fas servir :
.
Si vols pots "esborrar" la propietat d'un objecte utilitzant undefined
:
const mike: any = {
name: "Mike Smith",
email: "mike@gmail.com"
}
mike.email = undefined
console.log(mike.age) // undefined
console.log(mike.email) // undefined
En qualsevol moment pots consultar les propietats d'un objecte amb la funció `
En cualquire momento puedes consultar las propiedades de un objecto con la función Objec.keys()
:
const mike: any = {
name: "Mike Smith",
email: "mike@gmail.com",
}
mike.email = undefined
console.log(Object.keys(mike)) // [ 'name', 'email']
Pots veure que encara que el valor de la propietat email
és undefined
, la propietat segueix formant part de l'objecte.
Per ser un bon programador has de verificar el que pot semblar evident:
const mike = {
name: "Mike Smith",
email: "mike@gmail.com",
}
mike.age = 3
console.log(Object.keys(mike)) // [ 'name', 'email', 'age' ]
Puedes ver que las propiedades de un objeto son dinámicas, y en cualquier momento pueden cambiar.
Otros dos métodos útiles de Object
son Object.values()
para conocer los valores de la propiedades, y Object.entries()
si necesitas a la vez las claves de las propiedades y su valor.
Función
De la misma forma que una variable puede referenciar un función, una propiedad de un objeto puede refernciar
TODO
Extensiones
Por defecto los objetos son extendibles: se le pueden añadir nuevas propiedades en cualquier momento.
En cualquier momento puedes marcar un objeto como no extendible con el mètodo Object.preventExtensions()
:
const mike = {
name: "Mike Smith",
email: "mike@gmail.com",
}
Object.isExtensible() // === true
Object.preventExtensions(mike)
Object.isExtensible() // === false
mike.age = 3
console.log(Object.keys(mike)) // [ 'name', 'email' ]
Puedes ver que no se añade la propiedad age
.
Si quieres que no se ignore de manera silenciosa que el código ha tratado de añadir una propiedad a un objeto no extendible puedes utilizar la directiva "use strict"
:
"use strict"
const mike = {
name: "Mike Smith",
email: "mike@gmail.com",
}
Object.preventExtensions(mike)
mike.age = 3
console.log("age added)
Al ejecutar el código se producirá un error al intentar extender el objeto:
$ node mike.js
mike.age = 3
^
TypeError: Cannot add property age, object is not extensible
Congelar
TODO: Object.freeze()
Constructor
Function
También puedes utilitzar una función para crear objetos.
Mediante una función tenemos más control sobre como se crea un objeto, a la vez que el código es más legible y entendible si queremos crear un conjuto de objetos que comparten las mismas propiedades.
Crea un fichero employee.js
:
function Employee(name, salary) {
this.name = name;
this.salary = salary;
if (name == "david") {
this.salary += 30000;
}
}
const david = new Employee("David", 10000);
console.log(david.salary);
Ejecuta el fichero employee.js
:
$ npm employee.js
40000
Si te has fijado no utilizamos la función directamente si no que la precede la palabra new
:
const david = new Employee("David", 10000)
La palabra new
crea un objeto vacío que se pasa como argumento a la función Employee
, y dentro de la función se puede acceder al objeto que se ha creado con la palabra this
.
Class
En ES6 se ha añadido la sintaxis de clase, aunque javascript no tiene clases, para parecerse más a otros lenguajes - sólo en apariencia!.
Modifica el fichero Employee
para utilitzar una clase en lugar de una función:
class Employee {
constructor(name,salary) {
this.name = name;
this.salary = salary;
if (name == "David") {
this.salary += 30000
}
}
}
const david = new Employee("David", 10000);
console.log(david.salary); // 40000
Employee
no es una clase porque una clase limita las propiedades que pueden tener los objetos que pertenecen a dicha clase.
En javascript puedes añadir propiedades a un objeto de manera dinàmica:
const eva = new Employee("Eva", 20000);
eva.email = "eva@gmail.com"
const bob = new Employee("Bob", 15000);
bob.age = 30;
Lenguajes como Java nunca permitirían esto.