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

