实例化具有相同接口但表示形式不同的对象族的最佳方法

时间:2019-02-04 13:35:29

标签: javascript

我有一个带有树状结构的json文件。为了简单起见,可以说,层次结构中的每个对象都有一个children属性(数组)和一些其他属性,这些属性定义了它如何在DOM中呈现。层次结构可能如下所示:

{
  label: 'Group'
  children: [
    {
       label: 'Name1'
       children: []
    },
    {
       label: 'Subgroup'
       children: [
         {
            label: 'Name2'
            children: []
         },
         {
            label: 'Name3'
            children: []
         ,
       ]
    },        
  ]
}

所有对象通常具有相同的属性集,无论它们代表什么。在此示例中,我们仅区分组和节点,但实际上,还有许多属性可用于确定DOM中某个叶节点的呈现方式(例如,使用复选框或单选按钮等)其他)。在我的JavaScript中,我有一堆相应的构造函数,这些函数从层次结构中获取一个对象并构造一个新对象,该对象具有渲染,查找和其他附加功能。问题是如何调用正确的构造函数?在上面的示例中,规则很简单:如果一个对象没有子代,则它是一个叶子,如果有,则是一个组。但是,当对象更复杂并且需要正确实例化许多不同的“类型”对象时,有很多极端的情况使我检查数据然后决定使用哪个构造函数的方法越来越复杂,并且容易出错。

最好向每个对象添加另一个属性,告诉我应该调用哪个构造函数,或者应该为此使用数据本身?一般的方法是什么?我在想,如果我使用带有构造函数名称的属性,并且如果我在构造函数的命名空间中执行以下操作:

children.forEach(child => {
   let childWithMethods = new constructors[child.constructorName](child)
})

...这在代码中很好,但是确实引入了额外的数据

0 个答案:

没有答案