如何基于字符串值实例化对象

时间:2019-08-28 21:26:52

标签: javascript reactjs class ecmascript-6 ecmascript-7

我有一个字符串,我想在API工厂中使用它来实例化类中的正确对象。这是代码:

import StoryApiService from './story'
import AssignmentApiService from './assignment'

let apiTypes = {
    story: null,
    assignment: null
}
let token

const getApi = (newToken, apiType = 'story') => {
    const isNewToken = newToken => newToken !== token
    const shouldCreateService = !apiTypes[apiType] || isNewToken

    if( shouldCreateService ) {
        const capitalizedServiceType = apiType.charAt(0).toUpperCase() + apiType.slice(1)

        // this line is what I need help with
        apiTypes[apiType] = new `${capitalizedServiceType}ApiService`(token)
    }
    return apiTypes[apiType]
}

所以基本上取决于传入的apiType参数,我想从正确的类实例化一个新对象。我想尽可能避免使用if/elseswitch语句,因为我将使用很多不同的apiService,并且我认为这种方法会更简洁。

我知道上面代码中的行将无法正常工作,但是它的伪代码可以显示我想要达到的效果。

2 个答案:

答案 0 :(得分:4)

创建一个对象,将apiType名称直接映射到其对应的类,而不是尝试从字符串名称实例化一个类(具有一些复杂的大写/并置逻辑):

import StoryApiService from './story'
import AssignmentApiService from './assignment'

const services = {
    story: StoryApiService,
    assignment: AssignmentApiService,
}
const serviceInstances = {
    story: null,
    assignment: null,
}
let token

const getApi = (newToken, apiType = 'story') => {
    const isNewToken = newToken !== token
    const shouldCreateService = !serviceInstances[apiType] || isNewToken

    if (shouldCreateService) {
        token = newToken
        serviceInstances[apiType] = new services[apiType](token)
    }
    return serviceInstances[apiType]
}

答案 1 :(得分:-1)

执行与apiTypes[apiType]相同的操作:访问包含该类/构造函数的对象。

例如如果它是您在window范围内定义的类:

const ObjectType = window[`${capitalizedServiceType}ApiService`];

然后记住要确认已定义,因为您不能保证您的字符串实际映射到函数或类:

if (ObjectType) {
  apiTypes[apiType] = new ObjectType(token);
} else {
  console.error(`Api service for "${capitalizedServiceType}" does not exist.`);
}