Как мне сослаться на класс, которому дано его имя в виде строки?

В 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

В рубине:

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 ответа

Решение

Скопировал соответствующую часть с /questions/36382439/sozdat-obekt-iz-stroki-v-javasscript-ecmascript-6/36382463#36382463:

class Foo {
    some_method() { return 42 }
}

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

Пожалуйста, проголосуйте за этот оригинальный ответ.

Я предлагаю использовать переменную для отображения:

class Foo{
 a(){}
}

var class_map = {
 "Foo" : Foo
}

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

Здесь это указывает, что

глобально объявленные классы являются глобальными, но не свойствами глобального объекта...

Следовательно, вы должны отобразить явно

Другие вопросы по тегам