установка родителя на ребенка - круговая ссылка - PullRequest
0 голосов
/ 17 мая 2018

У меня есть два класса, Quest и Task, которые оба расширяют Event. Когда создается экземпляр Quest, он вызывает родительский класс Event для создания экземпляра множества Tasks в экземпляре Quest. Эти Tasks будут принадлежать экземпляру Quest.

Эта скрипка более кратко показывает, что я имею в виду. Это бесконечная круговая ссылка task.parent.task.parent.task.parent..., которая для сложных объектов, я беспокоюсь о влиянии производительности.

Дети Tasks должны сообщить своим родителям Quest, когда происходят определенные события. Итак, при создании экземпляра Quest и, таким образом, создании экземпляра Tasks, я передаю this, чтобы ребенок знал, кому он принадлежит:

new childEventClass(eventObj, this));

Очевидная проблема здесь заключается в том, что теперь у вас есть бесконечный цикл установки дочерних элементов для родительского элемента и родительского элемента для дочернего элемента, который теперь снова включает дочерние элементы и т. Д. Console.log родительского элемента Task, вы получить:

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 голосов
/ 17 мая 2018

Это бесконечная круговая ссылка, которая для сложных объектов, я беспокоюсь о влиянии производительности.

Нет, это не так.И это не имеет ничего общего с тем, являются ли эти объекты сложными или нет.

Итак, при создании экземпляра квеста и, тем самым, создании экземпляра задач, я передаю this, чтобы ребенок знал, кому он принадлежит

Это прекрасный способ установить необходимые циклические ссылки.

Очевидная проблема здесь в том, что теперь у вас есть бесконечный цикл установки потомков в родительском элементе.и родительский объект для дочернего элемента, который теперь снова включает в себя дочерних элементов

… но он не устанавливает их или пытается создать их снова, так что нет, у вас нетлюбая петля.Ваш код заканчивается.

Console.log родитель задачи, вы получаете ...

не проблема.Да, вы можете рекурсивно расширить эти ссылки.Вот почему они называются круговыми ссылками - вы можете бегать по ним, как по кругу.Но нет никакого вреда, если ты этого не сделаешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...