在孩子身上设置父母 - 循环参考

时间:2018-05-17 05:53:28

标签: javascript oop ecmascript-6

我有两个类QuestTask,它们都扩展了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) {
        ...
    }
};

1 个答案:

答案 0 :(得分:1)

  

这是一个无穷无尽的循环引用,对于复杂的对象,我担心性能的影响。

不,它没有。它与这些对象是否复杂无关。

  

因此,在实例化Quest,从而实例化任务时,我传递this,以便孩子知道它属于谁

这是设置所需循环引用的好方法。

  

这里显而易见的问题是你现在有一个无限循环设置父节点上的子节点,以及子节点上的父节点,现在又包括子节点

...但它没有设置它们或尝试再次创建它们,所以没有你没有任何循环。您的代码终止。

  

Console.log任务的父母,你得到......

不是问题。是的,您可以递归扩展这些引用。这就是为什么它们被称为循环引用 - 你可以像绕过一个圆圈一样运行它们。但是如果你不这样做就没有坏处。