ES6. Create class instance by name
Можно ли в es6 как-то создать экземпляр класса, если известно только его наименование?
class SomeClass{}; const className='SomeClass'; const instance=new window[className]();//win[className] - undefined |
Nexus,
а что, нельзя class SomeClass{}; const instance=new SomeClass(); ??? |
Dilettante_Pro, нет, нельзя.
У меня есть только data-атрибут, в котором содержится наименование сущности, для которой нужно подгрузить и инициализировать адаптер. Т.е. наименование класса динамичное. Пока что вижу выход только в использовании eval. |
class SomeClass{}; const className='SomeClass'; const obj = (Function('return new ' + className))() alert(obj instanceof SomeClass); |
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); } Плюсануть в карму, к сожалению, не могу из-за ограничений сайта. |
Все же создание и вызов функции, которая вернет экземпляр класса не сильно отличается от eval.
Более "цивилизованного" способа получить экземпляр класса по его имени нет? |
// 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) |
SuperZen, спасибо, я видел этот костыль.
|
Может, создать свой namespace для классов?
class SomeClass { constructor(name) { this.name = name; } sayHi() { alert(this.name); } } const classNS = { 'SomeClass': SomeClass }; let user = new classNS['SomeClass']("Вася"); user.sayHi(); |
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() ); |
Часовой пояс GMT +3, время: 11:21. |