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

如何在JavaScript子类构造函数中访问被覆盖的父类super属性?

问题根因

该现象是ES6类公共实例字段的标准执行逻辑导致的:
子类中显式声明的公共实例字段(本例中的name;),会在super()执行完成后、子类构造函数内super()后的代码执行前,自动初始化为undefined。你在父类A构造函数中通过Object.assign(this, options)给实例name赋的值,会被子类字段的自动初始化操作直接覆盖,因此最终拿到的是undefined。
你尝试访问super.name无法得到预期值是正常的:super用于访问父类原型对象上的属性和方法,而你父类构造中是将name挂载在实例对象上,不属于父类原型的属性,自然无法读取到。

可行解决方案

两种方案均保留B类的name显式声明,符合需求:

方案1:子类构造函数中手动赋值

在super(options)执行后手动给this.name赋值,覆盖自动初始化的undefined即可:

class A {
    constructor(options) { // options is just an object
        // here one of the keys just happens to be "name"
        Object.assign(this, options); 
    }
}

class B extends A {
    name; // 保留该声明,无需删除或移动

    constructor(options) {
        super(options);
        // 新增以下赋值逻辑
        this.name = options.name;
    }
}

const b = new B({name: "gigi"});
console.log(b.name); // 输出 gigi

方案2:给子类公共字段设置初始值

利用公共实例字段的初始化时机,直接在声明时指定初始值,无需修改构造函数代码:

class A {
    constructor(options) { // options is just an object
        // here one of the keys just happens to be "name"
        Object.assign(this, options); 
    }
}

class B extends A {
    // 直接给name字段设置初始值,会在super执行后自动完成赋值
    name = arguments[0].name;

    constructor(options) {
        super(options);
        // 无需额外修改构造逻辑
    }
}

const b = new B({name: "gigi"});
console.log(b.name); // 输出 gigi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:18:00