【发布时间】: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