访问 mixin 中的静态成员

Access static members in mixins

指令 this.constructor 在混入中不起作用。我得到一个 undefined 值。我想知道为什么会这样,是否可以使用这条指令。有一个代码示例:

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();

alert in printMaxZoom 将显示 undefined 字词。

答案是this.constructor在运行时指的是对象的class,那就是MyClass。我希望如果您将 printMaxZoom 修改为:

printMaxZoom: function(){
  alert(this.constructor === MyClass);
}

然后您会收到一条提示“正确”的警报。

这是在运行时确定类型(包括添加 mixin)的环境的固有特征。

如果你想引用一个Mixin的静态成员,你应该使用绝对语法,例如:

printMaxZoom: function(){
  alert(MZoomable.MAX_ZOOM);
}

请注意,始终 对静态变量使用绝对路径是一个好习惯,使用 this.constructor 作为快捷方式通常是一个错误。

例如:

qx.Class.define("MyClassOne", {
  extend: qx.core.Object,
  
  construct: function(){
    this.base(arguments);
    alert(this.constructor.MY_VALUE);
  },

  statics: {
    MY_VALUE: 23
  }
});


qx.Class.define("MyClassTwo", {
  extend: MyClassOne
});

// creates an alert that says "23"
var one = new MyClassOne();

// creates an alert that says "undefined"
var one = new MyClassTwo();

问题与您问题中的问题相同,因为 this.constructor 是对象的实际 class,而 不是 class(或 mixin)出现 this.constructor 语句的地方。