Después de esta solución tengo la siguiente clase:

com.temp.System = class {
    static initialize() {
        this.foo = 9;
        console.log("foo 1 is: " + this.foo);
    }

    static testMe() {
        console.log("foo 2 is: " + this.foo);
    }
}

Así es como lo uso:

{
    const System = com.temp.System;
    System.initialize();
    System.testMe();
}

Y esto es salida:

foo 1 is: 9
foo 2 is: 9

Y tengo dos preguntas:

  1. ¿Cuál es la mejor manera de crear campos estáticos en dicha solución?
  2. ¿Por qué funciona this.foo aunque no creo instancias de esta clase?
0
Pavel_K 25 feb. 2018 a las 13:00

4 respuestas

La mejor respuesta

¿Cuál es la mejor manera de crear campos estáticos en dicha solución?

No use la sintaxis class si no desea crear instancias de la misma.

com.temp.System = {
//                ^ simple object literal
    initialize() {
        this.foo = 9;
        console.log("foo 1 is: " + this.foo);
    },
    testMe() {
        console.log("foo 2 is: " + this.foo);
    }
};

¿Por qué funciona this.foo aunque no creo instancias de esta clase?

Porque no es una propiedad de instancia. Has creado System.foo = 9. this en un método es solo el objeto en el que se llamó a la función, que es el objeto de espacio de nombres en su ejemplo System.initialize().

3
Bergi 25 feb. 2018 a las 10:09

Por lo que sé, no hay no hay propiedades estáticas en ES6. Sin embargo, la pregunta que quiero hacer es diferente: ¿por qué necesita "propiedades de clase estática"? ¿En qué se diferencia eso de una constante o, si se desea que sea accesible desde el exterior de su clase, una constante exportada?

El enlace anterior ofrece un ejemplo de creación de "propiedades de datos estáticos" utilizando Object.defineProperty o simplemente la asignación directa a una clase MyClass.static = .... Sin embargo, no lo use a menos que entienda claramente por qué.

0
oleggromov 25 feb. 2018 a las 10:11

La mejor manera sería usar un literal de objeto viejo y simple:

com.temp.System = {
  foo: 5,

  initialize() {
    console.log("foo 1 is: " + this.foo);
  },

  testMe() {
    console.log("foo 2 is: " + this.foo);
  }
};
1
Jonas Wilms 25 feb. 2018 a las 10:12

this dentro de un static method apunta solo al class, así que cuando llamaste a initialize resultó en agregar una propiedad foo a la clase en lugar de una instancia. Es por eso que se definió cuando llamó testMe

2
Jiby Jose 25 feb. 2018 a las 10:09