Galvani
Galvani

Reputation: 246

Creating object by using string as a name

My function gets model name as string, I need to create new instance of object based on its name.

ex.:

    modelName = 'MockA';
    model = new modelName();

this is ofcourse not working. in php i would use

    model = new $$modelName

thanks in advance

Upvotes: 1

Views: 53

Answers (2)

GibboK
GibboK

Reputation: 73988

You can use an object factory or bracket notation.

Sample of code:

// First example: Use a Factory
var MockA = function() {
    this.sayHello = function() {
      console.log('Hi from MockA ');
    };
  },
  MockB = function() {
    this.sayHello = function() {
      console.log('Hi from MockB ');
    }
  },
  factory = function(type) {
    var obj;
    switch (type) {
      case 'MockA':
        obj = new MockA();
        break;
      case 'MockB':
        obj = new MockB();
        break;
    }
    return obj;
  }

var objA = factory('MockA');
objA.sayHello();
var objB = factory('MockB');
objB.sayHello();

// Second example: Using bracket notation
var models = {
  BaseMockA: {
    sayHello: function() {
      console.log('Hi from BaseMockA ');
    }
  },
  BaseMockB: {
    sayHello: function() {
      console.log('Hi from BaseMockB ');
    }
  }
};
var baseObjA = Object.create(models['BaseMockA']);
baseObjA.sayHello();
var baseObjB = Object.create(models['BaseMockB']);
baseObjB.sayHello();

Upvotes: 0

Andreas Louv
Andreas Louv

Reputation: 47137

If MockA is in global scope you can use:

var model = new window[modelName]();

if not then you should reconsider the way you store your models, eg. with an object of models:

var my_models = {
   MockA: function() {},
   MockB: function() {}
}

and to access

var MockA = my_models.MockA;
// or
var model_name = 'MockA';
var MockA = my_models[model_name];

Upvotes: 4

Related Questions