"存储"是否有用对象中的对象

时间:2012-12-02 14:45:51

标签: javascript object

在另一个对象中存储对象或对象的引用是否更好? 让我用一个例子来解释。

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

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 );

这是可以理解的吗?

2 个答案:

答案 0 :(得分:5)

绝对采用第一种更面向对象的方法。我没有看到有id和外部阵列的任何优点。但缺点是显而易见的:

  • 外部units数组可以在不注意的情况下进行修改,使得ids不同步且几乎无用。尝试调试!

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

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

  • 如果删除Team会怎样?

    • 如果您不直接删除所有Unit,则会导致内存泄漏

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

    • 如果同时删除单位并压缩units数组,则必须修改所有其他Team,因为数组中的索引将更改

  • Unit的ID没有商业价值

答案 1 :(得分:2)

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

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

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

所以我的投票绝对是替代方案1。