Подтвердить что ты не робот

Является ли циркулярная ссылка между объектами плохой практикой?

У меня есть модель, которая будет "переносить" (Model.validator) экземпляр валидатора с ним, и мне нужно, чтобы Validator имел доступ к атрибутам модели. Итак, я придумал следующее

var Validator = function(model) {
    this.model = model;
};

var Model = function() {
    this._attributes = {};
    this.validator = new Validator(this);
};

var model = new Model();

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

P.S. Я видел такие круглые ссылки между объектами в области Angular.js.

4b9b3361

Ответ 1

Этот тип кода не будет вызывать утечки памяти с сегодняшними браузерами; как упомянутый в MDN, все основные браузеры уже давно поставляются с GC-маркерами (которые могут обрабатывать только штрафы) (например, Сам Firefox имеет сборщик циклов с версии 3).

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

Ответ 2

У меня не будет никаких проблем. Большинство браузеров JS-анализаторов могут работать с циклами зависимостей при сборе мусора. Здесь больше нет потенциальных проблем.

Ответ 3

Это не проблема для сбора мусора: любой новый сборщик мусора ( > IE6) отлично справится с круговыми ссылками!

Возможно, это проблема, если вы выполняете рекурсивные функции или печатаете объект.

Итак, ответ: это не проблема, если вы не испортите себе: -)