一尘不染

在JavasScript ECMAScript 6中从字符串创建对象

javascript

我想使用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'];
        return new window[className](name); // this line throw error
    }
}

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

我做错了什么?


阅读 246

收藏
2020-04-25

共1个答案

一尘不染

不要将类名放在该对象上。将类本身放在那里,这样您就不必依赖它们是全局的并且可以通过(在浏览器中)访问window

顺便说一句,没有充分的理由将此工厂设置为类,您可能只会实例化一次(单例)。只是使其成为对象:

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);
    }
};
2020-04-25