1

我正在寻找替换 eval("new object();") 的最佳方法

丑陋的来源:

    //var type = window.$(droppedDomNode).data("shape");
    var type = "sankey.shape.Start";

    var figure = eval("new "+type+"();");
    
    // create a command for the undo/redo support
    var command = new draw2d.command.CommandAdd(this, figure, x, y);

eval 创建一个新的 sankey.shape.Start 对象。

我正在寻找替换这种代码的最佳解决方案。

谢谢

4

2 回答 2

5

我会构建一个构造函数的对象(映射)。

const constructors = {
  "sankey.shape.Start": () => new sankey.shape.Start(),
  // etc... (this could be built programmatically)
};

然后,

const figure = constructors[type]();
于 2022-02-10T13:52:52.477 回答
1

如果它是全局的,您可以拆分它并从窗口沿着路径走

var foo = {
  bar: {
    world: 'baz',
  }
}

const getIt = (str, start = window) => {
  return str.split(/\./).reduce((o, k) => o[k], start);
}


const x = "foo.bar.world";
console.log(getIt(x))

于 2022-02-10T13:58:02.090 回答