You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qooxdoo 6中Delegate继承调用父类方法报错的解决咨询

解决Qooxdoo 6严格模式下调用父类方法的错误

这个问题的核心是Qooxdoo 6的新编译器默认启用了严格模式,而你之前用的that.base(arguments, item)写法底层依赖了arguments.callee——严格模式明确禁止访问caller、callee这类属性,所以触发了TypeError。下面给你两种解决方案,从快速修复到更优雅的重构:

快速修复:修改父类方法的调用方式

你不需要再依赖arguments来调用父类方法,而是可以直接指定父类的方法引用。把子类的operatorDelegateItems方法修改成这样:

operatorDelegateItems : function(item, that) {
  if (item.getLabel() == "Period")
    item.setLabel("Jahresintervall");
  else
    // 明确传入父类的operatorDelegateItems方法作为第一个参数
    this.base(this.constructor.superclass.operatorDelegateItems, item, that);
}

这种写法绕过了对arguments.callee的依赖,完全符合严格模式的要求,能直接解决报错问题。

更优的重构方案:优化Delegate与继承逻辑

你的当前实现里用that来绑定上下文,代码略显繁琐,而且子类扩展的方式不够灵活。可以重构一下,让逻辑更清晰、更符合Qooxdoo的最佳实践:

1. 父类中重构Delegate与配置方法

把Delegate的上下文绑定简化,同时把配置逻辑抽成一个独立的、可被子类重写的钩子方法:

// 父类设置Delegate,用箭头函数绑定当前类的this,避免that变量
this.operatorController.setDelegate({
  configureItem: (item) => {
    this._configureOperatorItem(item);
  }
});

// 父类的配置钩子方法
_configureOperatorItem : function(item) {
  switch (item.getLabel()) {
    case "":
      item.setLabel(qx.locale.Manager.tr("Ist Vorhanden"));
      break;
    case "-":
      item.setLabel(qx.locale.Manager.tr("Ist nicht Vorhanden"));
      break;
    case "Nachfolger":
      item.setLabel(qx.locale.Manager.tr("Zeige Nachfolger"));
      break;
  }
}

2. 子类中优雅扩展

子类只需要重写_configureOperatorItem方法,直接调用父类逻辑即可,这里同样用明确的父类方法引用:

_configureOperatorItem : function(item) {
  if (item.getLabel() === "Period") {
    item.setLabel("Jahresintervall");
  } else {
    // 调用父类的配置逻辑
    this.base(this.constructor.superclass._configureOperatorItem, item);
  }
}

这种重构的好处:

  • 去掉了冗余的that变量,代码更简洁
  • 钩子方法的命名更清晰,明确表达其作用
  • 子类扩展逻辑更直观,符合面向对象的继承思想

为什么Qooxdoo 5.0.2没问题?

旧版本的Qooxdoo编译器没有默认启用严格模式,所以arguments.callee这类属性是可以正常访问的;而Qooxdoo 6的新编译器(如qxcompiler)为了更符合现代JS规范,默认开启了严格模式,因此之前的写法就触发了严格模式的限制。

内容的提问来源于stack exchange,提问作者F.F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:00:20