Создавайте красивые объекты на JavaScript, используя это простое объяснение шаблона проектирования OLOO Кайла Симпсона.

Каждый разработчик JavaScript знает, что объекты мощные; однако объекты JavaScript также обладают уникальным типом наследования, что дает им новые возможности экономии места.

Этот тип наследования называется прототипным наследованием, и этот тип наследования делает возможным OLOO.

OLOO расшифровывается как Объекты, связанные с другими объектами и представляет собой шаблон проектирования объектов.

Прежде чем эффективно использовать OLOO, необходимо понять основы прототипного наследования.

Прототипное наследование стало проще

В отличие от языков на основе классов, таких как Java и C#, в JavaScript есть только одна конструкция, использующая наследование: объект.

Каждый объект имеет частное свойство, которое содержит ссылку на другой объект, известный как его прототип.

Объект, на который указывает свойство prototype, имеет собственное свойство prototype, которое указывает на другой объект. Связи между объектами образуют цепочку прототипов, которая заканчивается на null.

Поскольку свойство prototype является частным, к нему нельзя получить доступ, просто вызвав его для объекта. Можно вызвать определенные методы на Object, чтобы проверить прототип объекта.

Что делает цепочка прототипов?

Объекты - это динамические наборы свойств.

Когда кто-то пытается получить доступ к свойству объекта, вызывающий объект будет проверяться первым.

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

За этой цепочкой следует следование свойству prototype на каждом связанном объекте, пока либо свойство не будет найдено, либо не будет достигнуто null.

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

OLOO принимает прототипное наследование

Разница между OLOO, шаблоном проектирования прототипа и конструктора, и синтаксическим сахаром class заключается в том, что OLOO поддерживает наследование прототипов. Два других просто имитируют классическое наследование, но при этом используют прототипное наследование под капотом.

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

Основное различие между прототипным и классическим наследованием заключается в следующем: при классическом наследовании полная копия свойств и методов родительского объекта создается в дочернем объекте.

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

Доступ к свойствам через цепочку прототипов называется делегированием поведения.

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

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

Используя OLOO, можно более четко использовать делегирование поведения и прототипное наследование.

Имеет ли смысл название Объекты, связанные с другими объектами?

Моделирование объектов с помощью OLOO

Объект-прототип - это объект, который определяет общий набор свойств для определенной группы объектов.

Например, взгляните на следующий инструмент.

Можно с уверенностью предположить, что все экземпляры Instrument будут использоваться для practice или perform. Но есть много разных инструментов. Как можно смоделировать уникальное состояние конкретного инструмента с помощью OLOO?

В большинстве проектов OLOO используется метод init для определения состояния одного объекта.

Теперь можно инициализировать объект с помощью состояния, по-прежнему делегируя поведение вверх по цепочке прототипов Instrument.

Object.create(prototype) создает новый объект с переданным prototype, установленным в качестве свойства prototype нового объекта. Чтобы узнать больше об этом методе, нажмите здесь.

Чтобы гарантировать, что объекты, созданные из прототипа, на самом деле не обладают свойствами прототипа, можно использовать метод Object.prototype.hasOwnProperty(propertyName). Этот метод возвращает true || false в зависимости от того, имеет ли объект свойство, переданное как propertyName.

Наконец, чтобы проверить, является ли определенный объект прототипом другого, можно использовать метод Object.prototype.isPrototypeOf(object).

Заключение

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

Дополнительную информацию об OLOO можно найти в книге Кайла Симпсона You Don’t Know JS.

Удачного кодирования!