在 es6+ 中,可通过函数式类工厂模拟“元类”行为,使子类声明时自动触发父类静态方法,无需修改子类语法或依赖运行时检测。
在 es6+ 中,可通过函数式类工厂模拟“元类”行为,使子类声明时自动触发父类静态方法,无需修改子类语法或依赖运行时检测。
虽然 JavaScript 没有 Python 那样的 __subclasses__ 或元类(metaclass)机制,也无法像 Python 的 __init_subclass__ 那样原生支持继承回调,但我们可以利用 类声明的求值时机 和 函数立即返回类构造器 的特性,巧妙实现“子类一定义就执行指定逻辑”。
核心思路是:不直接导出类,而是导出一个返回类的函数。该函数内部定义类、调用目标静态方法,再将类作为返回值。当子类使用 extends C() 语法时,C() 立即执行,完成初始化并返回类,从而达成“声明即触发”的效果。
正确示例:
function C() { class Cls { static m() { console.log('hi'); } } Cls.m(); // ✅ 此处立即执行,输出 'hi' return Cls;}class D extends C() {} // 控制台输出: "hi"
注意事项:
? 进阶提示:若需支持多层级继承或参数化初始化,可扩展为高阶工厂函数:
function createBaseClass(options = {}) { return function Base() { class Cls { static init() { console.log(`Initialized with`, options); } } Cls.init(); return Cls; };}const Base = createBaseClass({ debug: true })();class Child extends Base {}// 输出: "Initialized with { debug: true }"
总结:JavaScript 虽无原生继承钩子,但借助函数式类工厂,我们以简洁、符合语言规范的方式实现了类似 __init_subclass__ 的行为——关键在于理解类声明的本质是表达式求值,而非单纯语法糖。