Propiedades y Métodos Estáticos en JavaScript
En JavaScript, podemos asignar métodos a toda una clase usando métodos estáticos. Estos métodos están marcados con la palabra clave static
en la declaración de la clase:
class Usuario {
static metodoEstatico() {
alert(this === Usuario);
}
}
Usuario.metodoEstatico(); // Devuelve true
Este código realiza lo mismo que asignar directamente una función a la clase:
class Usuario { }
Usuario.metodoEstatico = function() {
alert(this === Usuario);
};
Usuario.metodoEstatico(); // Devuelve true
En ambos casos, this
dentro de Usuario.metodoEstatico()
hace referencia a la clase Usuario
misma.
Los métodos estáticos son útiles para funciones que pertenecen a la clase en su totalidad y no a instancias individuales. Por ejemplo, en una clase Articulo
, podríamos tener un método estático Articulo.comparar
para comparar dos artículos según su fecha:
class Articulo {
constructor(titulo, fecha) {
this.titulo = titulo;
this.fecha = fecha;
}
static comparar(articuloA, articuloB) {
return articuloA.fecha - articuloB.fecha;
}
}
let articulos = [
new Articulo("HTML", new Date(2019, 1, 1)),
new Articulo("CSS", new Date(2019, 0, 1)),
new Articulo("JavaScript", new Date(2019, 11, 1))
];
articulos.sort(Articulo.comparar);
alert(articulos[0].titulo); // Devuelve "CSS"
Aquí, Articulo.comparar
actúa sobre la clase en general para ordenar los artículos por fecha.
Otro caso común es el uso de un método estático como una fábrica para crear instancias con configuraciones específicas, como Articulo.crearHoy()
:
class Articulo {
constructor(titulo, fecha) {
this.titulo = titulo;
this.fecha = fecha;
}
static crearHoy() {
return new this("Resumen de hoy", new Date());
}
}
let articulo = Articulo.crearHoy();
alert(articulo.titulo); // Devuelve "Resumen de hoy"
Aquí, Articulo.crearHoy()
crea un artículo con el título «Resumen de hoy» y la fecha actual.
Es importante recordar que los métodos estáticos no están disponibles en instancias individuales de la clase. Por ejemplo, el siguiente código no funcionará:
let articulo = new Articulo("Intro a JavaScript", new Date());
articulo.crearHoy(); // Error: articulo.crearHoy is not a function
Las propiedades estáticas también son posibles en JavaScript y se definen de la siguiente manera:
class Articulo {
static editor = "Juan Pérez";
}
alert(Articulo.editor); // Devuelve "Juan Pérez"
Esto es equivalente a asignar directamente a Articulo
:
Articulo.editor = "Juan Pérez";
Las propiedades y métodos estáticos se heredan en JavaScript. Por ejemplo, si tenemos una clase Animal
con un método estático Animal.comparar
y una propiedad estática Animal.planeta
, estas son heredadas por clases que extienden Animal
:
class Animal {
static planeta = "Tierra";
static comparar(animalA, animalB) {
return animalA.velocidad - animalB.velocidad;
}
}
class Conejo extends Animal {
esconder() {
alert(`${this.nombre} se esconde!`);
}
}
let conejos = [
new Conejo("Blanco", 10),
new Conejo("Negro", 5)
];
conejos.sort(Conejo.comparar);
alert(Conejo.planeta); // Devuelve "Tierra"
En resumen, los métodos estáticos y las propiedades estáticas en JavaScript son útiles para funcionalidades que pertenecen a la clase en general y no a instancias individuales, proporcionando una forma eficiente de organizar y operar sobre datos y comportamientos específicos de la clase.