Члены объектов JavaScript, прототипированные как массивы: общие для всех экземпляров класса
При создании прототипов массивов в JavaScript крайне важно понимать, что эти члены становятся общими среди всех экземпляров класса. Такое поведение может показаться нелогичным, если вы привыкли к членам закрытых объектов.
Объяснение поведения
Механизм прототипов JavaScript позволяет объектам наследовать свойства и методы родительского объекта, известный как прототип. Когда вы определяете массив как свойство в прототипе, он становится доступным для всех объектов, унаследованных от этого прототипа.
Пример скрипта демонстрирует такое поведение:
function Sandwich() { // Uncomment this to fix the problem //this.ingredients = []; }
Если закомментированная строка не будет закомментирована, каждый экземпляр Sandwich будет иметь свой собственный массив ингредиентов. Однако, если строка закомментирована, все экземпляры используют один и тот же массив прототипов.
Это означает, что добавление ингредиента в чизбургер также обновляет ингредиенты blt и Spy_chicken_sandwich. Чтобы предотвратить это, вы должны определить массив ингредиентов внутри конструктора, как показано в обновленном примере ниже:
function Sandwich() { this.ingredients = []; }
Прототип и экземпляр
Очень важно различать свойства прототипа и свойства экземпляра. Свойства прототипа являются общими для всех объектов, которые наследуются от этого прототипа, а свойства экземпляра уникальны для каждого объекта.
Модификации кода для исправления Поведение
В примере скрипта раскомментируйте строку this.ingredients = []; в конструкторе Sandwich гарантирует, что каждый экземпляр имеет свой собственный массив ингредиентов, как и предполагалось.
Заключение
Понимание поведения прототипированных массивов в JavaScript имеет решающее значение для предотвращения неожиданного совместного использования среди экземпляров класса. Всегда помните, что данные, которые должны быть специфичными для экземпляра, должны быть определены внутри конструктора, тогда как общие данные могут быть назначены прототипу посредством наследования.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3