Как мне сослаться на класс, которому дано его имя в виде строки?
В 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']()
Здесь это указывает, что
глобально объявленные классы являются глобальными, но не свойствами глобального объекта...
Следовательно, вы должны отобразить явно