Variables declared with class behave similarly to those declared with const and let - they do not get implicitly assigned to the window object (which is arguably a good thing). If you wanted to put Unit on window, you would have to do so explicitly:
class Unit { constructor(){ console.log('constructing'); } } window.Unit = Unit; var str = "Unit"; var a = new window[str]();
You might consider using your own object of classes to avoid global pollution:
const myClasses = { Unit: class Unit { constructor(){ console.log('constructing'); } } }; var str = "Unit"; var a = new myClasses[str]();
Object values cannot reference each other while in the process of declaring an object literal - to put a subclass on myClasses that extends one of the existing classes, you'll have to do so outside of the myClasses declaration:
const myClasses = { Unit: class Unit { constructor(){ console.log('constructing'); } } }; myClasses.Child = class Child extends myClasses.Unit { constructor() { super(); console.log('Child running'); } } var str = "Child"; var a = new myClasses[str]();