在另一个对象中存储对象或对象的引用是否更好? 让我用一个例子来解释。
我有一个对象“团队”和一个对象“单元” 该单位属于该团队。 我想在我的对象“团队”中“存储”对象“单元”。
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 );
这是可以理解的吗?
答案 0 :(得分:5)
绝对采用第一种更面向对象的方法。我没有看到有id和外部阵列的任何优点。但缺点是显而易见的:
外部units
数组可以在不注意的情况下进行修改,使得ids不同步且几乎无用。尝试调试!
由于没有封装,每个Team
可以修改任何Unit
似乎一个数组存储对所有单位的引用,而只有一个Team
拥有 Unit
。
如果删除Team
会怎样?
如果您不直接删除所有Unit
,则会导致内存泄漏
您可能希望从公共units
表中删除其所有单位。但这会在units
表格中留下空白。
如果同时删除单位并压缩units
数组,则必须修改所有其他Team
,因为数组中的索引将更改
Unit
的ID没有商业价值
答案 1 :(得分:2)
如果你担心存储对象会占用更多内存,这是不正确的。
Javascript中的对象是存储在内存中某个位置的数据单元,但是当您在第一个代码示例中添加对象时,您只是添加对该内存的引用:您没有创建该对象的副本(这会使内存使用量增加一倍)。就存储而言,第二种方法没有性能优势。
现在,我们来谈谈设计。很多时候,我使用了关联数组等,其中对象的id不是它们的字段集的一部分。这总是会导致更复杂的代码,因为总有一段时间我需要将对象传递到某个地方而且还有它的id。除非有特殊情况另有规定,否则通常认为id被认为是对象的一部分。在概念层面上有意义的设计决策可能会导致更好的设计选择。
所以我的投票绝对是替代方案1。