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

发布于 2021-02-02 17:23:54

我想使用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');

我做错了什么?

关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看