本地运行ThreeJS+PhysiJS项目出现Class constructor cannot be invoked without 'new'报错
问题根因
你遇到的两个报错均为本地使用的Three.js版本远高于示例项目依赖的旧版本,旧版PhysiJS未适配新版Three.js API导致。
报错1:
THREE.Quaternion: .inverse() has been renamed to invert() 修复方案 打开本地项目的physi.js文件,全局搜索所有调用.inverse()的代码行,全部替换为.invert(),即可消除该警告。
报错2:
Uncaught TypeError: Class constructor Scene cannot be invoked without 'new' 修复方案 这个报错是因为新版Three.js中THREE.Scene已经重构为ES6 Class,旧版PhysiJS用ES5原型链继承、THREE.Scene.call(this)的调用方式不符合ES6 Class的初始化要求。
有两种可行修复方案:
- 方案1(新手推荐,无需修改PhysiJS代码):将项目引用的Three.js版本降级到r123及更早版本,该版本区间内
THREE.Scene仍为ES5构造函数,和旧版PhysiJS完全兼容。 - 方案2(需修改PhysiJS代码,适配新版Three.js):把PhysiJS中Scene的ES5继承逻辑改为ES6 Class继承,找到physi.js中Scene定义的部分,修改为如下写法:
Physijs.Scene = class extends THREE.Scene { constructor() { super(); // 此处保留原来PhysiJS Scene构造函数内的所有原有逻辑 } }
如果后续PhysiJS中其他继承Three.js内置类的模块也报同类错误,用相同的ES6 Class继承写法改造即可。
内容的提问来源于stack exchange,提问作者yabadaz
相关产品推荐
相关产品推荐

