相互依赖对象的模块模式

时间:2017-01-21 18:31:19

标签: javascript node.js

我在Node.js中寻找一个干净的设计模式,允许我在每个引用另一个模块时将两个类放在单独的模块中。

例如:我有NodeNodeCollection个对象。显然,NodeCollection必须知道Node是什么,但Nodes本身为其子女持有NodeCollection个对象。

目前我在需要时配置Node构造函数。

nodeCollection.js

const Node=require('./node')(NodeCollection)

 function NodeCollection(....){
   // do stuff with Node objects
 }

 module.exports = NodeCollection'

的node.js

function Node(NodeCollection){
  function _Node(...){
     this.children = new NodeCollection();
     //do stuff
  }

  return _Node;
}

module.exports = Node;

有没有更好的方法来设计它?

附录:似乎存在一些误解:我不是要求更好地设计NodeCollection或Node对象。这些是作为玩具示例提供的。通常,在这样的示例中,这两个类不能彼此不可知。我正在寻找一种在面对这样的安排时设置Node.js模块的方法。我可以通过将两个类放在同一个模块中来解决问题,但它们很大且足够复杂,以至于它们保证自己的文件。 三江源

1 个答案:

答案 0 :(得分:1)

我认为您不需要区分NodeNodes。像这样基本的东西会给你一个树形结构。

class Node {
  constructor(data) {
    this.data = _.omit(data, 'children');
    this.children = (data.children || []).map(child => new Node(child));
  }
}

const tree = new Node({
  name: 'bob', 
  children: [
    { name: 'bill' },
    { name: 'jim' },
    { name: 'luke' }
  ]
});

// yields...

{
  data: {name: 'bob'},
  children: [
    {
      data: {name: 'bill'}
    }
    ...etc
  ]
}