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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:57:16