Получить класс объекта из строкового имени в JavaScript - PullRequest
7 голосов
/ 13 апреля 2011

Я хотел бы получить объект от его имени в Javascript.Я работаю над приложением, которое должно будет загрузить какой-то другой контекст, я пытаюсь загрузить разные классы с помощью «унаследованного» плагина jquery.Все работает просто отлично, за исключением того, что когда мне нужно создать экземпляр класса, я не могу, потому что у меня есть только имя класса, а не объект напрямую.

В принципе, я хотел бы найти что-то вроде'getClass (String name)'.Кто-нибудь может мне помочь?

Ответы [ 4 ]

12 голосов
/ 13 апреля 2011

Не используйте eval().

Вы можете хранить свои классы на карте:

var classes = {
   A: <object here>,
   B: <object here>,
   ...
};

, а затем просто посмотрите их:

new classes[name]()
5 голосов
/ 13 апреля 2011
1 голос
/ 08 ноября 2018

Вы можете прекрасно использовать eval() без угрозы безопасности:

var _cls_ = {}; // serves as a cache, speed up later lookups
function getClass(name){
  if (!_cls_[name]) {
    // cache is not ready, fill it up
    if (name.match(/^[a-zA-Z0-9_]+$/)) {
      // proceed only if the name is a single word string
      _cls_[name] = eval(name);
    } else {
      // arbitrary code is detected 
      throw new Error("Who let the dogs out?");
    }
  }
  return _cls_[name];
}

// Usage
var x = new getClass('Hello')() // throws exception if no 'Hello' class can be found

Плюсы: вам не нужно вручную управлять объектом карты.

Минусы: нет. При правильном регулярном выражении никто не может запустить произвольный код.

0 голосов
/ 13 апреля 2011

Вы имеете в виду это?

function Person(name){
    this.name = name;
}

function getClass(str_name, args){
    return new (window[str_name])(args);
}

var wong2 = getClass("Person", "wong2");

alert(wong2.name);   // wong2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...