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

MooTools Class重载问题:父类keyup_func未触发 仅执行子类同名方法

错误原因
  • 核心问题是全局变量污染:你在Input_text的initialize方法中定义that = this时没有添加var/let/const声明,导致that成为挂载在window下的全局变量。
    实例化Input_text时全局that指向Input_text实例,后续实例化Input_date调用父类构造方法时,会覆盖全局that的值为Input_date实例。两个输入框的keyup事件回调都引用同一个全局that,所以永远触发Input_date的keyup_func方法。
  • 次要问题:你在类构造方法initialize中返回了DOM元素this.elem,所以new Input_text()的返回值是DOM节点而非类实例,后续调用.obj是无效的,会抛出属性不存在的报错。
修复方案

只需要把that改为局部变量即可解决重载失效问题,同时调整实例化后的调用逻辑:

var Input_text = new Class({ 
initialize: function(obj, defo){
    // 加var声明为局部变量,避免全局污染
    var that = this;
    if (obj) {
        this.elem = obj;
        this.elem.addEvent('keyup', function(event) {that.keyup_func(event)} );
    }
    else {            
        this.elem = new Element('input', {
            'type': 'text',
            events: {'keyup': function(event) {that.keyup_func(event)}}
        });
    }
    this.elem.set('value', defo);
    return this.elem;
},
keyup_func: function(evt) {
    alert(evt.key+' '+evt.code+' '+this.elem.get('tag'));
}
});

var Input_date = new Class({
Extends: Input_text,
initialize: function (obj, defo) {
    this.parent(obj, defo);
    this.elem.set('size',10);
    return this.elem;
},
keyup_func: function(evt) {
    console.log(evt.key+' '+evt.code+' '+this.elem.get('tag'))    
}
});

// 移除无效的.obj调用,直接对返回的DOM元素执行inject
obj_text = new Input_text(null, 'test').inject($('mydiv'));
obj_date = new Input_date(null, '2022').inject($('mydiv'));

你也可以用箭头函数替代局部that变量,写法更简洁:事件回调直接写成(event) => {this.keyup_func(event)},箭头函数会继承构造方法的this指向,不需要额外中转变量。

内容的提问来源于stack exchange,提问作者Michel J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:03