Отдельное поле не гарантирует отдельный массив
Массив в JavaScript является объектом. Если один заранее созданный массив присвоить полям двух экземпляров, оба поля будут ссылаться на него. Изменение содержимого через одну ссылку окажется видно через другую. Два разных имени свойства не создают две копии данных автоматически. Представьте две карточки корзин, от которых идут стрелки к одной коробке с товарами. Добавление товара меняет коробку, а не создаёт новую стрелку. Если же полю одной корзины присвоить другой массив, изменится сама связь. Полезно различать изменение содержимого объекта и замену значения свойства.
Общие методы и личное состояние выполняют разные роли
Обычные методы, объявленные в теле класса, располагаются в прототипе и доступны экземплярам через цепочку прототипов. Это позволяет разделять поведение. Данные конкретной корзины при этом обычно хранятся в её собственных полях. Общий способ добавления товара не требует общего списка товаров. Инициализатор поля экземпляра выполняется при создании каждого нового экземпляра. Если он создаёт новый массив, у каждого объекта появляется отдельный массив. Если он возвращает ссылку на заранее существующий общий массив, данные останутся общими. Важна выполняемая операция, а не только расположение строки в определении класса. Статические поля относятся к самому классу, а не к каждой отдельной корзине. Они могут быть уместны для сознательно общей информации. Но хранение в них персонального изменяемого состояния требует понимания последствий и не должно возникать случайно.
Проверьте идентичность и ожидаемое поведение
Для диагностики сначала создайте два экземпляра и сравните ссылки на их списки. Оператор строгого равенства для объектов проверяет, указывают ли ссылки на один объект, а не одинаково ли выглядят элементы внутри. Два независимых пустых массива не равны по идентичности. Затем добавьте элемент только через первый экземпляр и посмотрите на второй. Если по замыслу корзины независимы, его список должен остаться прежним. Такая небольшая проверка лучше выявляет проблему, чем наблюдение за большим интерфейсом с несколькими дополнительными слоями. Если используется копирование, уточните его глубину. Копия внешнего массива может всё ещё содержать ссылки на те же вложенные объекты. Тогда изменение свойства товара будет видно в обеих структурах. Выбор между общей ссылкой и независимыми данными зависит от модели, но его следует делать осознанно.
Попробуйте на практике
Изобразите две модели хранения данных корзин и предскажите результат изменения.
- Нарисуйте две корзины и один массив. Проведите от каждой корзины стрелку к нему, затем добавьте условный товар. Запишите, что увидят обе корзины.
- Нарисуйте второй вариант: у каждой корзины свой массив. Повторите добавление только в первую и сравните ожидаемый результат.
- Объясните, какой инициализатор нужен для независимых списков: создающий новый массив при каждом экземпляре или возвращающий общий заранее созданный массив.
- Добавьте в рисунок вложенный объект товара и рассмотрите поверхностную копию массива. Отметьте, какие ссылки могут остаться общими, даже если внешние массивы различаются.
Как проверить результат. Вы различаете собственное поле и независимый объект данных. На схеме видно, почему общий метод не мешает отдельному состоянию, а поверхностная копия не обязательно разделяет вложенные объекты.
Частые вопросы
Разные экземпляры класса всегда имеют полностью независимые данные?
Нет. Они могут ссылаться на одни и те же внешние объекты. Независимость зависит от того, какие значения создаются и присваиваются при инициализации.
Общий массив всегда является ошибкой?
Нет. Совместное состояние бывает частью замысла. Ошибка возникает, когда оно не соответствует ожидаемому поведению или изменяется без понятных правил владения и доступа.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.