JavaScript如何在对象中同时定义类及其子类表达式
问题原因
你的写法无法正常运行,核心问题有两个:
- 作用域引用错误:对象字面量初始化时,属性名不会注册为当前作用域的可访问标识符。
dog类声明里写extends animal时,JS引擎只会沿作用域链找名为animal的独立变量/类声明,不会主动读取正在构造的myClasses对象上的animal属性,会直接抛出ReferenceError: animal is not defined。 - 代码笔误:父类构造函数里两次给
this.a赋值,this.b永远是undefined。
可行实现方案
方案1:提前声明父类(最推荐,可读性最好)
先在当前作用域定义父类,再把父子类统一组装到目标对象里:
class Animal { a; b; constructor(x, y) { this.a = x; this.b = y; // 修复原代码的赋值笔误 } } const myClasses = { animal: Animal, dog: class extends Animal { constructor(d, e) { super(d, e); } bark() { console.log('woof!'); } } };
验证效果:
const myDog = new myClasses.dog(1, 2); myDog.bark(); // 控制台输出 woof! console.log(myDog.a, myDog.b); // 输出 1 2
方案2:分步骤挂载对象属性
如果不想在作用域额外声明独立类变量,可以先初始化空对象,先挂父类再挂子类——挂载子类时父类已经是对象上的可访问属性,能正常被extends引用:
const myClasses = {}; // 先挂载父类 myClasses.animal = class { a; b; constructor(x, y) { this.a = x; this.b = y; } }; // 再挂载子类 myClasses.dog = class extends myClasses.animal { constructor(d, e) { super(d, e); } bark() { console.log('woof!'); } };
运行效果和方案1完全一致。
避坑提示:不要尝试在单个对象字面量里直接写
dog: class extends myClasses.animal,此时myClasses还处于初始化的暂存死区,同样会抛出引用错误。
内容的提问来源于stack exchange,提问作者oelna
相关产品推荐
相关产品推荐

