我有两个类Quest
和Task
,它们都扩展了Event
。实例化Quest
时,它会调用其父类Event
以在Tasks
实例上实例化多个Quest
。这些Tasks
将属于Quest
个实例。
这fiddle更简洁地显示了我的意思。它是task.parent.task.parent.task.parent...
的无限循环引用,对于复杂的对象,我担心性能的影响。
当某些事件发生时,孩子Tasks
需要告诉他们的父母Quest
。因此,在实例化Quest
,从而实例化Tasks
时,我传递this
,以便孩子知道它属于谁:
new childEventClass(eventObj, this));
这里显而易见的问题是你现在有一个无限循环设置父项上的子项,子项上的父项,现在又包括子项,等等.Console.log Task
&#39 ;父母,你得到:
Quest {
id: 1,
children: [
Task: {
id: 1,
parent: Quest {
id: 1,
children: [
Task: {
id: 1,
etc...
},
...
]
},
...
},
...
]
}
你怎么能避免这种情况?
其他档案:
this.quest = new Quest(quest);
类:
class Event {
constructor(args, childEventClass, childEventClassName) {
if (childEventClass && childEventClassName && args[childEventClassName] && args[childEventClassName].length > 0) {
this.children = args[childEventClassName].map(eventObj => new childEventClass(eventObj, this));
}
}
...
}
class Quest extends Event {
constructor(args) {
super(args, Task, 'tasks');
}
};
class Task extends Event {
constructor(args, parent) {
super(args, Activity, 'activities');
this.parent = parent;
}
};
class Activity extends Event {
constructor(args, parent) {
...
}
};
答案 0 :(得分:1)
这是一个无穷无尽的循环引用,对于复杂的对象,我担心性能的影响。
不,它没有。它与这些对象是否复杂无关。
因此,在实例化Quest,从而实例化任务时,我传递
this
,以便孩子知道它属于谁
这是设置所需循环引用的好方法。
这里显而易见的问题是你现在有一个无限循环设置父节点上的子节点,以及子节点上的父节点,现在又包括子节点
...但它没有设置它们或尝试再次创建它们,所以没有你没有任何循环。您的代码终止。
Console.log
任务的父母,你得到......
不是问题。是的,您可以递归扩展这些引用。这就是为什么它们被称为循环引用 - 你可以像绕过一个圆圈一样运行它们。但是如果你不这样做就没有坏处。