Objecto

Javascript es un lenguaje de programación basado en objetos que no utiliza clases para definir los objetos.

Puedes crear un objeto directamente tal como se muestra a continuación:

const mike = {}

Propiedades

En este caso el objeto está vació.

Puedes verificar que el objeto no tiene una variable name:

const mike = {}
console.log(mike.name) // undefined

Si quieres le puedes añadir una variable name al objeto:

const mike = {}
mike.name = "Mike Smith"
console.log(mike.name) // 'Mike Smith'

La sintaxis es la misma que la que utilizas para definir una variable, excepto que dices que la variable name está definida dentro del contexto de la variable mike.

Además, a las variables de un objeto se les suele llamar propiedades del objeto (aunque siguen siendo variables a efectos prácticos).

También puedes definir las propiedades del objeto al crear el objeto tal como se muestra a continuación:

const mike = { 
    name: "Mike Smith", 
    email: "mike@gmail.com" 
} 

La principal diferencia es que en lugar de = utilitzamos :.

Si quieres puedes "borrar" una propiedad de un objeto usando undefined:

const mike = { 
  name: "Mike Smith", 
  email: "mike@gmail.com" 
} 

mike.email = undefined

console.log(mike.age)  // undefined
console.log(mike.email)  // undefined

En cualquire momento puedes consultar las propiedades de un objecto con la función Objec.keys():

const mike = { 
  name: "Mike Smith", 
  email: "mike@gmail.com",
} 

mike.email = undefined

console.log(Object.keys(mike))  // [ 'name', 'email']

Puedes ver que aunque el valor de la propiedad email sea undefined la propiedad sigue formando parte del objeto.

Para ser un buen programador tienes que verificar lo que puede ser evidente:

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.