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.