Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.10.2018, 11:38
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

ES6. Create class instance by name
Можно ли в es6 как-то создать экземпляр класса, если известно только его наименование?

class SomeClass{};

const className='SomeClass';
const instance=new window[className]();//win[className] - undefined
Ответить с цитированием
  #2 (permalink)  
Старый 17.10.2018, 11:58
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Nexus,
а что, нельзя
class SomeClass{};
const instance=new SomeClass();

???
Ответить с цитированием
  #3 (permalink)  
Старый 17.10.2018, 12:02
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Dilettante_Pro, нет, нельзя.
У меня есть только data-атрибут, в котором содержится наименование сущности, для которой нужно подгрузить и инициализировать адаптер.
Т.е. наименование класса динамичное.

Пока что вижу выход только в использовании eval.
Ответить с цитированием
  #4 (permalink)  
Старый 17.10.2018, 12:05
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

class SomeClass{};

const className='SomeClass';
const obj = (Function('return new ' + className))()
alert(obj instanceof SomeClass);
Ответить с цитированием
  #5 (permalink)  
Старый 17.10.2018, 12:11
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

destus, спасибо, только что тоже самое написал.
/**
		 * @param {string} engine
		 * @param {string|jQuery} $node
		 * @return {AbstractAdapter}
		 */
		static get(engine,$node){
			const adapterName=engine.substr(0,1).toUpperCase()+engine.substr(1).toLowerCase();
			const constructor=new Function('$node','return new '+adapterName+'Adapter($node);');

			return constructor($node);
		}

Плюсануть в карму, к сожалению, не могу из-за ограничений сайта.
Ответить с цитированием
  #6 (permalink)  
Старый 17.10.2018, 12:14
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Все же создание и вызов функции, которая вернет экземпляр класса не сильно отличается от eval.
Более "цивилизованного" способа получить экземпляр класса по его имени нет?
Ответить с цитированием
  #7 (permalink)  
Старый 17.10.2018, 15:19
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

// definition
import One from './One'
import Two from './Two'

const classes = { One, Two }

export default function dynClass(name) {
  return classes[name]
}

// usage
import dynClass from './dynClass'

const UnknownClass = dynClass('One')

new UnknownClass(props)
Ответить с цитированием
  #8 (permalink)  
Старый 17.10.2018, 15:30
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

SuperZen, спасибо, я видел этот костыль.
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2018, 16:29
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Может, создать свой namespace для классов?
class SomeClass {
  constructor(name) {
    this.name = name;
  }
  sayHi() {
    alert(this.name);
  }
}

const classNS = {
  'SomeClass': SomeClass
};


let user = new classNS['SomeClass']("Вася");
user.sayHi();
Ответить с цитированием
  #10 (permalink)  
Старый 17.10.2018, 16:50
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Dilettante_Pro, тогда уж лучше так классы объявлять:
var SomeClass=(function(){
	class SomeClass{
		getName(){
			return this.constructor.name;
		}
	};

	return SomeClass;
})();

class ClassFactory{
	static createClass(name){
		return new window[name]();
	}
}

console.log(
	ClassFactory.createClass('SomeClass').getName()
);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смишных картинок тред megaupload Оффтопик 3448 03.07.2023 09:47
Выполнение <script> При определенном class ilya1099 Javascript под браузер 0 06.11.2016 23:12
Унылого треша тред megaupload Оффтопик 648 17.06.2014 14:31
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Как работает функция Class godofjavascript Оффтопик 58 17.12.2012 09:49