类表达式可动态创建类并继承,extends后支持变量、函数调用等表达式;父类可为内置类、自定义类或返回类的函数;需用const/let声明,支持条件继承与匿名/命名形式。

类表达式可以动态创建类,配合 extends 实现继承,关键在于把父类作为变量传入,让子类在定义时就能引用它。
基本语法:用变量控制继承目标
类表达式允许你将 class 作为值赋给变量,extends 后面可以是任意可求值的表达式(包括变量、函数调用、三元运算等),不局限于字面类名。
- 父类可以是已定义的类、内置类(如
Array、Error),甚至是一个返回类的函数 - 子类名可省略(匿名类表达式),也可显式命名(用于调试和
constructor.name) - 必须用
const/let声明,不能用var(存在暂时性死区)
动态继承内置类或自定义类
下面例子中,父类由参数决定,子类在运行时生成:
function createSubclass(ParentClass, name) {
return class extends ParentClass {
constructor(...args) {
super(...args);
this.type = name;
}
};
}
// 动态继承 Array
const MyList = createSubclass(Array, 'MyList');
const list = new MyList(1, 2, 3); // [1, 2, 3]
list.push(4);
console.log(list.type); // 'MyList'
console.log(Array.isArray(list)); // true
// 动态继承自定义基类
class Shape { constructor(color) { this.color = color; } }
const ColoredCircle = createSubclass(Shape, 'ColoredCircle');
const c = new ColoredCircle('red');
console.log(c.color); // 'red'
运行时选择父类(条件继承)
利用三元表达式或函数返回值,在定义类时决定继承谁:
const useStrictMode = true;
// 根据条件继承不同基类
const Logger = class extends (useStrictMode ? Error : Object) {
log(msg) {
console.log(`${this.constructor.name}: ${msg}`);
}
};
// 如果 useStrictMode 为 true,Logger.prototype.__proto__ === Error.prototype
// 否则为 Object.prototype
注意要点与常见陷阱
动态继承不是“运行时改写原型链”,而是在类定义阶段就确定 [[Prototype]]。需留意:
-
super()必须在子类构造器中调用,且只能在this访问前调用 - 若父类是
null或非构造函数,会抛出TypeError - 匿名类表达式的
name属性为空字符串;建议显式命名便于调试:class NamedChild extends Parent {...} - 类表达式本身不会被提升,必须先声明再使用


















