在JavasScript ECMAScript 6中从字符串创建对象 [英] Create object from string in JavasScript ECMAScript 6

查看:99
本文介绍了在JavasScript ECMAScript 6中从字符串创建对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用ES6创建对象工厂,但旧式语法不适用于新的。



我有下一个代码:

  export class Column {} 
export class Sequence {}
export class Checkbox {}

export class ColumnFactory {
constructor(){
this.specColumn = {
__default:'Column',
__sequence:'Sequence',
__checkbox:'Checkbox'
};
}

create(name){
let className = this.specColumn [name]? this.specColumn [name]:this.specColumn ['__ default'];
返回新窗口[className](name); //这行抛出错误
}
}

let factory = new ColumnFactory();
let column = factory.create('userName');

我做错了什么?

解决方案

不要在该对象上放置类名。将课程自己放在那里,以便您不必依靠他们在全球和可访问(在浏览器中)通过窗口


$ btw,没有什么好的理由让这个工厂成为一个类,你可能只会实例化一次(单例)。只需使它成为一个对象:

  export class Column {} 
export class Sequence {}
export class复选框{}

export const columnFactory = {
specColumn:{
__default:Column,//< -
__sequence:Sequence,//< -
__checkbox:复选框//< -
},
create(name,... args){
let cls = this.specColumn [name] || this.specColumn .__默认;
返回新的cls(... args);
}
};


I want create object factory using ES6 but old-style syntax doesn't work with new.

I have next code:

export class Column {}
export class Sequence {}
export class Checkbox {}

export class ColumnFactory {
    constructor() {
        this.specColumn = {
            __default: 'Column',
            __sequence: 'Sequence',
            __checkbox: 'Checkbox'
        };
    }

    create(name) {
        let className = this.specColumn[name] ? this.specColumn[name] : this.specColumn['__default'];
        return new window[className](name); // this line throw error
    }
}

let factory = new ColumnFactory();
let column = factory.create('userName');

What do I do wrong?

解决方案

Don't put class names on that object. Put the classes themselves there, so that you don't have to rely on them being global and accessible (in browsers) through window.

Btw, there's no good reason to make this factory a class, you would probably only instantiate it once (singleton). Just make it an object:

export class Column {}
export class Sequence {}
export class Checkbox {}

export const columnFactory = {
    specColumn: {
        __default: Column,    // <--
        __sequence: Sequence, // <--
        __checkbox: Checkbox  // <--
    },
    create(name, ...args) {
        let cls = this.specColumn[name] || this.specColumn.__default;
        return new cls(...args);
    }
};

这篇关于在JavasScript ECMAScript 6中从字符串创建对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆