Seleccionar página

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.

classfunction
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.

    classfunction
    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.

      classfunction
      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 Índicenombres y Symbol