Вы можете использовать Element.classList.add
let div = document.createElement('div');
div.classList.add("myDiv")
Я настоятельно рекомендовал бы, что Вы помещаете как можно больше настройки в конфигурацию, вместо того, чтобы кодировать.
Код, который ищет значение в объекте конфигурации, намного более прост, чем инстанцирование подкласса.
Можно также смешать два путем помещения имен классов в файл конфигурации и инстанцирования классов на основе тех имен. Это позволяет Вам совместно использовать настройки между двумя или больше клиентами более легко, также.
Большинство Ваших мыслей о направлении для взятия твердо; проблема входит при вызове Job2-> some_method () в противоположность $job-> some_method (). Таким образом, Ваши вызовы метода класса являются только проблемой, потому что они - плохая идея во-первых - который Вы видите, потому что они вмешиваются в Вас усиливающий ООП.
То, что я сделал бы в Вашей ситуации, пишут мой код так, чтобы я использовал вызовы метода объекта, а не вызовы метода класса, и дал каждой установке проекта хеш конфигурации, который может использоваться для сообщения этого, какой класс это хочет использовать для данной цели. Таким образом, это посмотрело бы что-то как:
my $job2_class = $project->conf->{job2_class} || 'Job2';
my $job2 = new $job2_class;
$job2->some_method();