4

存储对象或引用其他对象中的对象更好吗?让我用一个例子来解释。

我有一个对象“团队”和一个对象“单元”,该单元属于团队。我想在我的对象“团队”中“存储”对象“单元”。

1)我可以这样做:单位存储在团队对象中

// class Team
function Team() {
    this.units = [];
}
// class Unit
function Unit(team) {
    team.units.push(this);
}
myTeam = new Team();
units = [];
units[units.length] = new Unit( myTeam );

2)或类似的东西:单位ID存储在团队对象中

// class Team
function Team() {
    this.units = [];
}
// class Unit
function Unit(team, id) {
    team.units.push(id);
}
myTeam = new Team();
units = [];
units[units.length] = new Unit( myTeam, units.length );

可以理解吗?

4

2 回答 2

5

肯定会采用第一种更面向对象的方法。我没有看到拥有 id 和外部数组的任何优势。但缺点也很明显:

  • 可以在您不注意的情况下修改外部units数组,从而使 id 不同步并且几乎没用。尝试调试!

  • 由于没有封装,每个都Team可以修改任何Unit

  • 似乎一个数组存储对所有单元的引用,而只有一个Team 拥有Unit.

  • 如果你删除一个会发生什么Team

    • 如果你不Unit直接删除所有的s,你会得到内存泄漏

    • 您可能想从公用units表中删除其所有单位。但这会在units表格中留下空白。

    • 如果您也删除单元并压缩units数组,则必须修改所有其他Teams,因为数组中的索引会更改

  • id ofUnit没有商业价值

于 2012-12-02T14:57:36.613 回答
2

如果您担心存储对象会占用更多内存,那么这是不正确的。

Javascript 中的对象是存储在内存中某处的数据单元,但是当您在第一个代码示例中添加对象时,您只是添加对那块内存的引用:您没有创建对象的副本(这会加倍内存使用情况)。就存储而言,第二种方法没有性能优势。

现在,让我们谈谈设计。很多时候,我使用关联数组等,其中对象的 id 不是其字段集的一部分。这总是会导致更复杂的代码,因为总有一段时间我需要将对象传递到某个地方,而且还需要传递它的 id。除非有特殊情况另有规定,否则将 id 视为对象的一部分通常是完全合理的。在概念层面上有意义的设计决策可能会导致更好的设计选择。

所以我的投票绝对是备选方案 1。

于 2012-12-02T15:17:38.293 回答