如何将类名称作为字符串引用?

时间:2017-04-21 09:17:19

标签: javascript ecmascript-6 es6-class

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实例不在范围之外,因此该解决方案通常不合适。

编辑以解决可能的重复问题:工厂,注册管理机构等仅在我可以参考工厂中的现有课程时才起作用,但如果我想提及的课程事先不知道,我就不能使用这项工作 - 周围。

2 个答案:

答案 0 :(得分:-2)

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

class Foo{
 a(){}
}

var class_map = {
 "Foo" : Foo
}

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

Here它指定了

  

全局声明的类是全局变量,但不是属性   全球对象......

因此,您必须明确地映射

答案 1 :(得分:-2)

https://stackoverflow.com/a/40069309/46395

复制相关部分
class Foo {
    some_method() { return 42 }
}

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

请提出原始答案。