在JavaScript中如何在一个类内部定义另一个类?
JavaScript 实现类挂载内部类的方案
你需要的bla.FooBarBaz用法(其中bla为类、FooBarBaz为其内部类)可以通过以下两种方式实现:
方案1:类外挂载静态属性(兼容所有支持ES6的环境)
直接把内部类作为外层类的静态属性挂载即可:
// 定义外层类(如果要使用小写的bla,直接把类名改成bla即可) class Bla { constructor() { this.instanceProp = "外层类实例属性"; } } // 挂载内部类到外层类 Bla.FooBarBaz = class { constructor() { this.innerProp = "内部类实例属性"; } // 内部类自有方法 innerMethod() { console.log("内部类方法执行成功"); } }
调用示例:
// 你需要的调用形式 const innerIns = new Bla.FooBarBaz(); innerIns.innerMethod(); // 输出:内部类方法执行成功 // 外层类正常实例化不受影响 const outerIns = new Bla(); console.log(outerIns.instanceProp); // 输出:外层类实例属性
方案2:类内直接定义静态内部类(ES2022+ 支持)
如果运行环境(现代浏览器、Node.js 16+)支持ES2022新特性,可以直接在外层类内部声明静态类,写法更聚合:
class Bla { constructor() { this.instanceProp = "外层类实例属性"; } // 直接定义静态内部类 static FooBarBaz = class { constructor() { this.innerProp = "内部类实例属性"; } innerMethod() { console.log("内部类方法执行成功"); } } }
调用方式和方案1完全一致。
额外说明
如果需要内部类访问外层类的私有静态成员,直接在类内定义的静态内部类天然支持该能力:
class Bla { // 外层类私有静态属性 static #privateStaticVal = "外层私有静态值"; static FooBarBaz = class { getOuterPrivateVal() { return Bla.#privateStaticVal; } } } console.log(new Bla.FooBarBaz().getOuterPrivateVal()); // 输出:外层私有静态值
内容的提问来源于stack exchange,提问作者John GradientOS
相关产品推荐
相关产品推荐

