Métodos y Atributos Estáticos en JavaScript

Clase 2 de 20Curso Intermedio de Programación Orientada a Objetos en JavaScript

Resumen

Si declaramos una propiedad o método de una clase como static, podremos acceder a estos sin la necesidad de instanciar dicha clase o prototipo.

Este tipo de atributos/métodos no son exclusivos de JavaScript, sino de casi todos los lenguajes que soportan la programación orientada a objetos.

Declarando métodos y atributos static en JavaScript

De la siguiente manera podemos declarar atributos o métodos como static dentro de una clase (aplicable también a prototipos):

<class Patito {
	static sonidito = "cuak!";

	static hacerSonidito() {
		return "cuak! x2";
	}
}

// Por fuera de clase Patito, podemos acceder a lo siguiente sin crear alguna instancia:
// Al atributo `sonidito`
console.log(Patito.sonidito)

// Al método `hacerSonidito`
console.log(Patito.hacerSonidito());>

Métodos static de la superclase Object

El superprototipo Object posee algunos métodos de tipo static y como todos los objetos que creamos en JavaScript heredan funcionalidad de Object, podemos acceder a una lista de funciones static que vendrán por defecto en nuestros objetos creados.

Obtener las llaves de un objeto

El método keys del superprototipo Object nos permite obtener el nombre de las llaves de un objeto en una lista:

<const objetito = {
    name: "Juanito",
    email: "juanito@frijolitos.io",
    age: 18,
}

console.log(
	Object.keys(objetito)
); // [ 'name', 'email', 'age' ]>

Podríamos obtener lo mismo con el método getOwnPropertyNames:

<const objetito = {
    name: "Juanito",
    email: "juanito@frijolitos.io",
    age: 18,
}

console.log(
	Object.getOwnPropertyNames(objetito)
); // [ 'name', 'email', 'age' ]>

Obtener los pares llave-valor de un objeto

Con el método entries de Object conseguimos tener en listas separadas los llave-valor declarados en un objeto. Estas listas serán almacenadas en otra lista:

const objetito = {
    name: "Juanito",
    email: "juanito@frijolitos.io",
    age: 18,
}

console.log(
	Object.entries(objetito)
);

/* > Impresión en consola:
[
  [ 'name', 'Juanito' ],
  [ 'email', 'juanito@frijolitos.io' ],
  [ 'age', 18 ]
]
*/>

Conocer el límite de acceso de un objeto

Existe un método static propio de Object que es muy interesante: el método getOwnPropertyDescriptors.

<const objetito = {
    name: "Juanito",
    email: "juanito@frijolitos.io",
    age: 18,
}

console.log(
	Object.getOwnPropertyDescriptors(objetito)
);>

Esto nos devuelve un objeto con los atributos de nuestro objeto inicial. Cada atributo contiene un objeto con el valor correspondiente a dicha propiedad, además de 3 propiedades adicionales: writable, configurable y enumerable.

<{
  name: {
    value: 'Juanito',
    writable: true,
    enumerable: true,
    configurable: true
  },
  email: {
    value: 'juanito@frijolitos.io',
    writable: true,
    enumerable: true,
    configurable: true
  },
  age: {
		value: 18,
		writable: true,
		enumerable: true,
		configurable: true
	}
}>

Estas 3 propiedades son usadas por JavaScript internamente para indicar el límite de acceso y modificación que tiene un objeto. Con esto podríamos utilizar ciertas técnicas para manejar el encapsulamiento (uno de los pilares de la POO) de los objetos según lo que deseemos.

Veamos más ejemplos de los métodos estáticos del prototipo Object y sobre el comportamiento que puede tener this. 👨‍💻

Contribución creada por: Martín Álvarez (Platzi Contributor)