【问题标题】:How do I refer to a class given its name as a string? [duplicate]如何将给定名称的类称为字符串? [复制]
【发布时间】:2026-01-29 05:30:02
【问题描述】:

在 Perl 中:

package Foo {
    sub new { bless {} }
    sub some_method { 42 }
}
my $f = "Foo"->new;
say ref $f;         # 'Foo'
$f->some_method;

在 Python 中:

class Foo:
    def some_method():
        return 42

f = globals()['Foo']()
print(type(f).__name__)     # 'Foo'
f.some_method

在 Ruby 中:

class Foo
    def some_method
        return 42
    end
end

f = Module.const_get('Foo').new
puts f.class            # 'Foo'
f.some_method

在 Javascript 中:

class Foo {
    some_method() { return 42 }
}

let f = new ?????????????;
console.log(f.constructor.name);    // 'Foo'
f.some_method();

如果 Foo 是一个普通函数而不是一个类,this["Foo"] 可以工作,但你如何处理类?我试过eval,但是f的实例在作用域之外是不会存在的,所以这个方案一般不适合。


编辑以解决可能的重复问题:工厂、注册表等仅在我可以引用工厂中现有的类时才起作用,但如果我想引用的类事先不知道,我就不能使用这项工作-周围。

【问题讨论】:

  • new Foo() ....?
  • @AnmolMittal:完全忽略了问题的重点:OP 想通过名称引用 Foo:new something['Foo']()
  • 伙计们,请阅读该死的问题。有 3 个其他语言的示例,其中他通过名称来引用该类。
  • 但是当你可以通过“Foo”直接访问类时,为什么要让它变得更复杂呢??
  • @AnmolMittal 因为有时您只能知道要在给定范围内实例化的类的名称。这个问题确实有道理,只是已经在其他帖子中回答过。

标签: javascript ecmascript-6 es6-class


【解决方案1】:

我建议使用一些变量进行映射:-

class Foo{
 a(){}
}

var class_map = {
 "Foo" : Foo
}

var f = new class_map['Foo']()

Here 它指定了

全局声明的类是全局的,但不是 全局对象...

因此,您必须明确映射

【讨论】:

    【解决方案2】:

    https://*.com/a/40069309/46395复制了相关部分:

    class Foo {
        some_method() { return 42 }
    }
    
    let f = new(eval('Foo'));
    console.log(f.constructor.name);    // 'Foo'
    f.some_method();
    

    请为原始答案投票。

    【讨论】:

    • 如果是骗子,CV就是骗子,不要回答。