微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 使用动态名称在ES6中创建一个类的实例?

这个问题在这里已经有一个答案:> Create object from string in JavasScript ECMAScript 64个
我想通过将一个字符串变量传递给一个函数来实例化一个特定的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的例子,维护一个名称到类的映射,你可以有一个类的工作是取所需类的名称并代理其实例化:

[See it working]

定义你的课程

// 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 举报,一经查实,本站将立刻删除。

相关推荐