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

JavaScript子类中lessonObj未定义问题及代码修正咨询

问题原因

问题出在父类Page的构造函数调用init的时机上。当创建Lesson实例时,super()执行Page的构造函数,此时调用的this.init()虽理论上应指向子类Lesson的init方法,但受类初始化顺序影响,可能导致子类的init逻辑未完全执行,lessonObj未被正确赋值。

修改方案

调整父类Page的构造函数,移除自动调用init的逻辑,改为在子类Lesson的构造函数中主动调用init,确保子类初始化逻辑完整执行:

class Item
{
    name;

    constructor(name)
    {
        this.name = name;
    }
}

class Page
{
    pageObj;
    
    constructor()
    {
        // 移除构造函数中的init调用,交由子类控制初始化时机
    }  

    init()
    {
        this.pageObj = new Item('John');
    }  
}

class Lesson extends Page
{
    lessonObj;
    
    constructor()
    {
        super();
        this.init(); // 子类主动触发初始化
    }  

    onClick(event)
    {
        alert(this.pageObj.name);
        alert(this.lessonObj.name);
    }

    init()
    {
        super.init(); // 执行父类初始化逻辑

        this.lessonObj = new Item('Mary');
        document.addEventListener('click', event => this.onClick(event));            
    }  
}

new Lesson();
补充说明

原代码中用箭头函数绑定this的写法是正确的,能保证onClick中的this指向Lesson实例。修改后,子类init方法会被明确调用,lessonObj会被正确初始化,点击时即可正常访问this.lessonObj.name。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:10:37