I have code like this
class Animal{} class Dog extends Animal {} class Cat extends Animal {} class Donkey extends Animal {}
I want to look at all of the classes in my application’s universe, and when I find one that descends from Animal, I want to create a new object of that type and add it to the list. This allows me to add functionality without having to update a list of things. So I can avoid the following:
var animals = []; animals.push( new Dog() ); animals.push( new Cat() ); animals.push( new Donkey() );
PS: I don’t want to add extra functionality to my classes or call them explicitly.
Advertisement
Answer
Here what I discovered so far http://jsbin.com/xiroyurinu/1/edit?js,console,output
class Animal{} class Dog extends Animal {} class Cat extends Animal {} class Donkey extends Animal {} var animals = getAllSubclasses(Animal); console.log(animals.map(function(c){ return new window[c] })) // creates objects document.body.innerText = animals; // Dog, Cat, Donkey
and the magic
function getAllSubclasses(baseClass) { var globalObject = Function('return this')(); var allVars = Object.keys(globalObject); var classes = allVars.filter(function (key) { try { var obj = globalObject[key]; return obj.prototype instanceof baseClass; } catch (e) { return false; } }); return classes; }
The main disadvantage of this method is that I can not use ES6 module import and have to do old fashioned and simple contatenation of files, but this is still better that nothing.
PS: still wait for better answer
UPD: and ye, i know that to use this all classes must be defined globally, that’s why i search for better way to do this..