*Это взято из курса Udacity по шаблонам проектирования Javascript*

Псевдоклассический шаблон проектирования Javascript всегда приводил вас в замешательство? Тогда этот блог для вас! На простом примере я разберу этот шаблон проектирования, чтобы показать, как он работает.

Javascript на самом деле не имеет системы классов, такой как Java и C++, поэтому этот шаблон называется псевдоклассическим, потому что он напоминает систему классов этих других языков.

Прежде чем мы углубимся в псевдоклассический шаблон, давайте сначала опишем, что такое цепочка прототипов:

Цепочки прототипов

Цепочки прототипов в Javascript — это механизм, позволяющий объектам напоминать другие объекты. Допустим, мы создаем новый объект и хотим, чтобы он имел те же свойства, что и другой объект. Один из способов заключается в том, что мы копируем каждое свойство из желаемого объекта в новый объект. Вместо того, чтобы каждый раз выполнять эту задачу вручную, Javascript предоставляет нам возможность цепочек прототипов, которые делегируют неудачные поиски из первого объекта во второй. Дайте нам знать, посмотрите на простой пример того, как это делается:

Здесь у нас есть два объекта car и toyota. Мы хотим, чтобы у toyota было то же свойство wheels, что и у объекта car:

var car = {wheels:4};
console.log(car.wheels); //4
var toyota = Object.create(car); //Prototype chain: toyota object now inherits from the car object
toyota.price = 5;
console.log(toyota.wheels); //Due to the Prototype chain, toyota object will delegate its lookup to car and the result will be: 4
console.log(toyota.price); //5

Используя функцию Object.create(), мы создаем объект, который имеет функцию делегирования поиска функции. Мы передаем желаемый резервный объект car в Object.create, и это создает для нас новый объект toyota, который делегирует поиск сбоев в car. Поскольку toyota.wheels недоступен в локальной области видимости объекта toyota, он делегирует его объекту автомобиля и дает нам правильный результат 4.

Прототип объекта

В нашем предыдущем примере мы видели, что делегаты объекта toyota терпят неудачу при поиске объекта car. Но делегирует ли объект car также неудавшиеся поиски глобальному объекту? Ответ ДА!

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

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

Теперь, когда мы получили некоторое базовое представление о прототипах, теперь давайте спроектируем класс Javascript, используя псевдоклассический шаблон проектирования. Для ясности мы создадим один файл с именем Car.js, в нем мы создадим класс Car и instance.js, где мы будем создавать экземпляры класса Car.

Режим конструктора:

Использование ключевого слова new перед вызовом функции в instance.js позволяет функции-конструктору Car в Car.js работать в специальном режиме, называемом Режим конструктора, в котором интерпретатор вставляет несколько строк операций в код функции конструктора, необходимых для создания экземпляра объекта.

Контейнеры методов:

Поскольку обычно создаются объекты-держатели для методов и присоединяются как свойство функции-конструктора; Javascript предоставляет возможность делать это автоматически. Всякий раз, когда создается функция, к ней прикрепляется объект, который можно использовать в качестве контейнера для методов. Этот объект по умолчанию, контейнер методов, который поставляется с каждой функцией, хранится в ключе .prototype.

В нашем примере метод move() хранится в этом свойстве:

Car.prototype.move = function(){
  this.loc++;
};

Диаграмма, объясняющая внутреннюю работу нашего простого примера:

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