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

求助:代码报错「Class extends value #<Object> is not a constructor or null」

解决「Class extends value # is not a constructor or null」报错问题

嘿,这个报错我太熟了!核心原因就是你尝试继承的目标不是一个有效的构造函数——要么是普通对象、null,要么是导入导出时没拿到类本身。结合你给的代码和场景,我梳理了几个最可能的问题和解决办法:


1. 先检查子模块的导出/导入逻辑

从你monster.js里引入minimonster.js的代码来看,大概率是minimonster.js的导出方式错了,导致你拿到的miniMonster不是类构造函数。

错误示范(minimonster.js):

要是你这么写导出:

const monster = require('./monster.js');

class miniMonster extends monster {
  // 你的子类逻辑
}

// 坑点:导出的是包含类的对象,不是类本身!
module.exports = { miniMonster };

那在monster.js里require拿到的miniMonster是个普通对象,不是类,执行new miniMonster()肯定会报错。

正确写法:

直接导出类本身就行:

const monster = require('./monster.js');

class miniMonster extends monster {
  constructor(options) {
    super(options); // 子类必须调用super()继承父类属性
    // 子类自己的逻辑
  }
}

// 直接导出类
module.exports = miniMonster;

2. 小心循环引用的坑

如果monster.js和minimonster.js互相导入(比如A导入B,B又导入A),模块加载时会出现循环引用,这时候其中一个模块可能还没初始化完成,你拿到的就是个空对象,自然触发报错。

解决办法:

  • 把公共逻辑抽离到单独的小模块,避免互相引用
  • 调整导入时机,比如把require放在需要使用的函数内部,而不是模块顶部

3. 顺便修正父类构造函数的小问题

你的monster类构造函数参数有个小瑕疵:

constructor(options = { name }, health) {
  this.options = options;
  this.health = 100;
  // ...
}

你实例化时用了new monster("Godzilla"),这时候options会被赋值成字符串"Godzilla",不是你预期的{name: "Godzilla"}。要么改成正确的实例化方式:

let bigMonster = new monster({ name: "Godzilla" });

要么调整构造函数参数,让它更符合使用习惯:

constructor(name, health = 100) {
  this.options = { name };
  this.health = health;
  // ...
}
// 这样就能直接传字符串:new monster("Godzilla")

4. 检查类名的拼写和大小写

JavaScript是大小写敏感的!要是你在minimonster.js里定义的类是MiniMonster,但导入后用new miniMonster()(小写开头),也会出问题。确保导入的变量名和导出的类名完全一致。

如果按上面的步骤调整后还是有问题,把minimonster.js的完整代码贴出来,我再帮你排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:23:52