es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceda a los miembros estáticos en mixins

La instrucción this.constructor no funciona en mixins. Obtiene un valor indefinido. Me pregunto por qué sucede y si es posible usar esta instrucción. Aquí hay un ejemplo de código:

qx.Mixin.define("MZoomable", {
    statics: {
      MAX_ZOOM: 500
    },

    members: {
      printMaxZoom: function(){
        alert(this.constructor.MAX_ZOOM);
      }  
    }
});

qx.Class.define("MyClass", {
  extend: qx.core.Object,
  include: [MZoomable],

  constuct: function(){
    this.base(arguments);
  }
});

const o = new MyClass();
o.printMaxZoom();

El alert en printMaxZoom mostrará la palabra indefinido.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que this.constructor no funciona en mixins es que los mixins no son clases en sí mismos. Son simplemente un conjunto de métodos y propiedades que se pueden incluir en otras clases. Cuando usas this.constructor en un mixin, se refiere a la clase que está usando el mixin, no al mixin en sí mismo.

    Para hacer referencia a los estáticos del mixin en la clase que lo usa, puedes usar la palabra clave self en lugar de this.constructor. La palabra clave self se refiere a la clase que define el método actual, que en este caso sería el mixin.

    Aquí tienes el ejemplo de código actualizado:
     

    qx.Mixin.define("MZoomable", {
      statics: {
        MAX_ZOOM: 500
      },
    
      members: {
        printMaxZoom: function(){
          alert(this.self.MAX_ZOOM);
        }  
      }
    });
    
    qx.Class.define("MyClass", {
      extend: qx.core.Object,
      include: [MZoomable],
    
      construct: function(){
        this.base(arguments);
      }
    });
    
    const o = new MyClass();
    o.printMaxZoom();
    

    Usar this.self en lugar de this.constructor hará referencia correctamente a la propiedad estática MAX_ZOOM definida en el mixin.

Comments are closed.