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
相关产品推荐
相关产品推荐

