javascriptoopecmascript-6ecmascript-harmony

Find all classes in a Javascript application that extend a base class


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.


Solution

  • 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..