报错:Class constructor cannot be invoked without 'new' 求助(非继承非原生类场景)
嘿,我来帮你捋捋这个问题——我之前在处理类继承时也踩过类似的坑。从你贴的CObject代码来看,这个报错大概率和你继承的BaseObject实现,或者构造函数的调用方式有关,咱们一步步拆解排查:
先检查
BaseObject是否是标准ES6 Class
这个错误最常见的场景之一,就是用ES6class extends去继承一个ES5风格的构造函数,而且这个构造函数没做new调用的校验。比如如果BaseObject是这么写的:function BaseObject() { // 没有检查是否通过new调用 // ...其他逻辑 }ES6类的构造函数强制要求用
new调用,但当你调用super()时,底层可能会以普通函数的方式去调用ES5的BaseObject构造函数,直接触发报错。你可以去看看BaseObject的源码,如果是ES5写法,要么给它加上new校验(比如在构造函数开头加if (!(this instanceof BaseObject)) return new BaseObject()),要么调整转译工具的兼容配置(比如TypeScript把target设为ES6+)。确认实例化CObject的方式是否正确
有没有可能在某个地方,你或者团队里的人不小心直接写了CObject()而不是new CObject()?虽然你定义CObject用的是ES6 class,但如果把它当普通函数调用,就会抛出这个错误。仔细扫一遍所有实例化CObject的代码,确保都用了new关键字。排查转译工具的配置问题
如果你用了TypeScript或者Babel,转译后的代码可能出现兼容性bug。比如TypeScript的target版本设得太低(比如ES5),转译后的类继承逻辑没处理好ES6到ES5的兼容。可以看看你的tsconfig.json里的target是不是设成了ES6或更高版本,确保转译逻辑能正确处理类继承。检查BaseObject构造函数的特殊逻辑
有没有可能BaseObject的构造函数里做了非常规操作?比如返回了一个非this的对象,或者构造函数需要必填参数,但你在CObject的constructor里调用super()时没传?虽然这种情况更多会触发其他错误,但也可以核对下BaseObject的构造函数签名,确保super()的调用参数是匹配的。
给你个小建议:先写个最小复现案例测试,比如把BaseObject简化成最基础的ES6类,然后继承它看看会不会报错:
class BaseObject { constructor() { console.log('Base构造函数执行'); } } export class CObject extends BaseObject { constructor() { super(); } static url(path: string): string { return ""; } static wssUrl(): string { return ""; } } // 实例化测试 const testObj = new CObject();
如果这个简化版能正常运行,那问题肯定出在你项目里的BaseObject具体实现,或者项目的转译配置上。
内容的提问来源于stack exchange,提问作者GlGuru

