代码之家  ›  专栏  ›  技术社区  ›  Alex

从require()获取类实例

  •  0
  • Alex  · 技术社区  · 6 年前

    假设我有一个正常的模块

      module.exports = class MyClass{ }
    

    使用它的标准方法如下:

    const MyClass = require('myclass.js');
    

    但是如果我不知道类名和文件名是变量呢?我怎样才能从中学到这门课?

    const ???? = require(file + '.js');
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Andreas Müller    6 年前

    considerung类是“引擎盖下”的函数,您可以访问函数的名称,也可以在运行时访问该名称。但是,为了创建实例,您不需要知道所需文件中类的名称,因为您在所需文件中都给了它一个新的别名。因此,您真正需要知道的是需要的文件名。

    // my-class.js
    module.exports = class MyClass { }
    
    // require-class.js
    const MyNewClassName = require("./my-class");
    console.log(MyNewClassName.name); // => "MyClass"
    const classInstance = new MyNewClassName();
    console.log(classInstance); // => MyClass { }
    

    如果要确保保留类的名称并公开它,我建议将对象导出为命名空间。如果要使其成为通用的,可以通过 Object 像这样的帮手

    // my-class.js
    class MyClass {}
    module.exports = {MyClass: MyClass};
    // or module.exports = {MyClass};
    
    // requiring file ...
    const importedObject = require("./my-class");
    const myInstance = new importedObject.MyClass();
    const objectsInRequire = Object.keys(importedObject); // => ["MyClass"]
    
        2
  •  1
  •   Estus Flask    6 年前

    变量可以任意命名,类名无关紧要,因为它是导入的整个模块,而模块导出本身就是一个类。如果它被命名为export-like就很重要了 exports.MyClass = class MyClass {...} .

    .js 扩展也是可选的,而相对路径很重要。

    它是:

    const MyClassNameDoesntMatterHere = require('./' + className);