这个问题在这里已经有一个答案:>
Create object from string in JavasScript ECMAScript 64个
我想通过将一个字符串变量传递给一个函数来实例化一个特定的ES6类.根据变量的值,将创建一个不同的类.
我想通过将一个字符串变量传递给一个函数来实例化一个特定的ES6类.根据变量的值,将创建一个不同的类.
示例 – 我有2个类,ClassOne,Classtwo.我想要能够将一个变量传递给一个函数并返回一个新的类.类的名称将与变量相关联 – 例如.通过’二’将创建Classtwo.
我不想只使用这样的switch子句:
function createRelevantClass( desiredSubclassName ) { let args = [],newClass; switch( desiredSubclassName ) { case 'One' : newClass = new ClassOne(args); break; case 'Two' : newClass = new Classtwo(args); break; } return newClass; }
相反,我想以某种方式能够使用变量名称创建构造函数调用.那可能吗?
function createRelevantClass( desiredSubclassName ) { // desiredSubclassName would be string 'One' or 'Two' // how to use the 'new' operator or Reflect here to create the class based on the variable passed in let newClass = ( *magic code to build constructor dynamically* ); return newClass; }
解决方法
有几种方法可以完成这个…
代理类
从@ thefourtheye的例子,维护一个名称到类的映射,你可以有一个类的工作是取所需类的名称并代理其实例化:
定义你的课程
// ClassOne.js export class ClassOne { constructor () { console.log("Hi from ClassOne"); } } // Classtwo.js export class Classtwo { constructor (msg) { console.log(`${msg} from Classtwo`); } }
定义代理类(例如Dynamicclass)
import ClassOne from './ClassOne'; import Classtwo from './Classtwo'; // Use ES6 Object Literal Property Value Shorthand to maintain a map // where the keys share the same names as the classes themselves const classes = { ClassOne,Classtwo }; class Dynamicclass { constructor (className,opts) { return new classes[className](opts); } } export default Dynamicclass;
使用示例
import Dynamicclass from './Dynamicclass'; new Dynamicclass('ClassOne'); //=> "Hi from ClassOne" new Dynamicclass('Classtwo','Bye'); //=> "Bye from Classtwo"
2.工厂功能
使用一个对类名称对象执行查找的函数 – >类映射和返回引用类,我们可以照常实例化.
定义出厂功能
import ClassOne from './ClassOne'; import Classtwo from './Classtwo'; const classes = { ClassOne,Classtwo }; export default function dynamicclass (name) { return classes[name]; }
使用示例
import dynamicclass from './dynamicclass' const ClassOne = dynamicclass('ClassOne') // Get the ClassOne class new ClassOne(args) // Create an instance of ClassOne
原文地址:https://www.jb51.cc/js/153042.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。