Javascript 相互依赖对象的模块模式

Javascript 相互依赖对象的模块模式,javascript,node.js,Javascript,Node.js,我在Node.js中寻找一种干净的设计模式,允许我在引用彼此时将两个类放在单独的模块中 我有Node和NodeCollection对象。显然,NodeCollection必须知道节点是什么,但节点本身为其子节点持有NodeCollection对象 目前,我正在配置需要的节点构造函数 nodeCollection.js node.js 有更好的设计方法吗 附录:似乎有一些误解:我不是在要求更好的NodeCollection或Node对象设计。这些是作为玩具的例子提供的。通常,在这样的例子中,这两个

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

我有Node和NodeCollection对象。显然,NodeCollection必须知道节点是什么,但节点本身为其子节点持有NodeCollection对象

目前,我正在配置需要的节点构造函数

nodeCollection.js

node.js

有更好的设计方法吗

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

我认为在您的情况下,不需要区分节点和节点。类似这样的基本功能将为您提供一个树结构

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
  ]
}

考虑打字:为什么要将集合构造函数传递给模型构造函数?只需要在您的每个文件中定义模型和集合。因为,正如我所解释的,节点对象需要使用NodeCollection来容纳它们的孩子。如果您给出实际尝试的示例,而不是玩具示例,这将有助于我们帮助您。我要说的是,我在JavaScript中看到的大多数问题最好是在忘记了经典的基于继承的语言中使用的大部分内容之后解决的。我确实需要一个NodeCollection对象,一个简单的数组,就像在你的示例中一样,在我的设计中是不够的。NodeCollection具有标准阵列上不可用的专用属性和方法。请将它们放入Node类中。每个节点和子节点都是同一个构造函数的实例,因此您也可以给出一个节点方法。它们都是大型类。将它们组合在一起会使事情变得非常笨拙,这正是将它们拆分为单独模块的目的
function Node(NodeCollection){
  function _Node(...){
     this.children = new NodeCollection();
     //do stuff
  }

  return _Node;
}

module.exports = Node;
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
  ]
}