JavaScript | Array | constructor

JavaScript | Array | constructor

В официальной документации очень скупо описан метод constructor для объектов-прототипов класса Array.

«Начальное значение Array.prototype.constructor — это %Array%

По такому описанию сложно понять о чём вообще идёт речь. Попробую для вас изложить более подробно, что это за метод и зачем он нужен.

 

Что такое конструктор в JavaScript?

Заранее скажу — всё в JavaScript является объектами (объекты, строки, массивы, числа, функции).

В языке JavaScript существует такое понятие, как «ГЛОБАЛЬНЫЙ ОБЪЕКТ». Он встроен в конструкцию языка.

У этого ГЛОБАЛЬНОГО ОБЪЕКТА есть множество собственных свойств. Одним из таких свойств является класс Array.

Когда мы создаём массив вида [1,2,3], то мы создаём экземпляр класса Array. Это всегда так. Именно по этой причине у разных объектов есть свои уникальные наборы методов, которые работают только с прототипами своих классов.

Это значит, что мы не можем вызвать метод pow() у экземпляра Array, потому что метод pow() создан для работы с экземплярами класса Math. По той же причине мы не можем вызвать метод filter() у экземпляров класса Math, потому что метод filter() работает только с экземплярами Array.

За все эти взаимосвязи отвечает КОНСТРУКТОР своего класса.

 

Как конструктор связан с классами?

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

КОНСТРУКТОР нужен для создания объектов-прототипов, которые в последствии будут уметь работать с методами прототипов данного класса.

 

Зачем нужен метод constructor?

В публикации JavaScript | Как проверить наличие объекта в массиве? хорошо описан пример применения метода constructor. Почитайте!

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

Есть массив:

var massiv = [1, 2]

У него можно обратиться к constructor и обратиться к ключу name:

massiv.constructor.name

В ответ мы получим:

"Array"
Получили название класса массива методом constructor и свойством name - JavaScript
Получили название класса массива методом constructor и свойством name — JavaScript

То есть теперь мы точно знаем, что в переменной massiv хранится экземпляр класса Array, а значит к этой переменной мы можем применять все методы для объектов-прототипов Array.

 
Сейчас вам может показаться, что всё очевидно. Мы же создали массив, а значит он принадлежит классу Array. Но представьте, что у вас есть сложная бизнес-логика в алгоритме, которая постоянно перезаписывает одну и ту же переменную.

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

На каком-то этапе нужно будет сортировать запросы старого формата с запросами нового формата. Почему «нужно»? Потому что вы не сможете донести до каждого пользователя необходимость перехода на новую систему. Пользователи не любят перемены. Значит вам нужно будет где-то в коде определять что сейчас хранится в переменной — прототип «Array»?, прототип «Object»?, прототип «String»?, прототип «HTMLCollection»?, прототип «NodeList»?, прототип «Dата»?, прототип «URL»? и так далее ….

Знание имени КОНСТРУКТОРА помогает создавать правильные сортировки в условиях.

Свойства метода constructor для Array - JavaScript
Свойства метода constructor для Array — JavaScript

Информационные ссылки

Стандарт ECMAScript — Раздел «The Array Constructor» — https://tc39.es/ecma262/#sec-array-constructor