Los miembros estáticos de una clase son métodos y propiedades que residen en el objeto del constructor y no en cada uno de los objetos creados a partir de ella. Esto puede parecer un poco confuso, pero las funciones son objetos y, por lo tanto, pueden tener propiedades y métodos asignados directamente a ellos. Tenemos bastantes ejemplos en Javascript: podemos utilizar new Array()
para obtener una matriz, pero también Array.isArray()
como un método estático de ese constructor. Por lo tanto, no es algo que deba sorprendernos demasiado.
Organizar nuestro código al rededor de una función constructora nos permite mantener todos los elementos relacionados en un mismo sitio y, por lo tanto, es una opción que debemos considerar.
métodos estáticos
Para definir miembros estáticos con class
utilizamos la sintaxis static
nombre_metodo
(){}
. Estos métodos se definirán en la función constructora.
En el caso de function
simplemente añadimos directamente los nuevos miembros como propiedades de la función constructora.
class | function |
class C { static method () { return 3; } } console.assert( C.method() === 3 ); | function C () { } C.method = function () { return 3; }; console.assert( C.method() === 3 ); |
Si revisamos el objecto constructor, veremos que ahora tiene un nuevo método:
métodos de acceso estáticos
Los métodos de acceso a una propiedad también pueden definirse como estáticos de una forma muy parecida a la que hemos utilizado para los métodos. En el caso de class
sólo tenemos que añadir static
antes del get
y/o set
. Si utilizamos function
entonces utilizaremos Object.defineProperty()
o Object.defineProperties()
sobre la propia función con un descriptor que incluya los métodos de acceso.
class | function |
class C { static get x () { return 'C'; } } console.assert( C.x === 'C' ); | function C () { } Object.defineProperty( C, 'x', { get () { return 'C' } } ); console.assert( C.x === 'C' ); |
Ahora el constructor tiene una método de acceso get
:
propiedades estáticas
No disponemos de una forma específica de crear propiedades estáticas. En una próxima especificación se va a incluir la posibilidad de definir campos estáticos en las clases.
De momento, para añadir propiedades estáticas sólo podemos utilizar el objeto de la clase constructora y asignarle una propiedad. Si queremos tener más control sobre las características de esta propiedad podríamos definirla con Object.defineProperty()
o Object.defineProperties()
, aunque en muchos casos no será necesario y basta con su simple asignación.
class | function |
class C { } C.x = 'C'; console.assert( C.x === 'C' ); | function C () { } C.x = 'C'; console.assert( C.x === 'C' ); |
Ahora el objeto de la función constructor tiene una nueva propiedad:
conclusión
Como hemos podido observar, el mayor interés de crear miembros estáticos de una clase se centra en las funciones, pudiendo organizar nuestro código junto con las clases. También puede tener sentido crear algunas propiedades específicas que tengan un significado singular para nuestras clases. En cualquier caso, los miembros estáticos son interesantes y en muchos casos podemos aprovecharnos de su funcionamiento.
métodos de acceso y datos privados | Índice | nombres y Symbol |