Что за свойства prototype и constructor?

384
21 октября 2017, 19:19

Наблюдения я буду приводить на классе - конструкторе Object, так как отдельно о этих свойствах ничего не нашел. На Современный учебник Javascript есть ООП в прототипном стиле, но конкретного определения нету.

Я пошел на сайты Веб-документация MDN - Mozilla, MSDN – сеть разработчиков Microsoft на который прочел про данные свойства.

Начнем со свойства constructor.

  1. Object.prototype.constructor: Возвращает ссылку на функцию Object, создавшую прототип экземпляра. Обратите внимание, что значение этого свойства является ссылкой на саму функцию, а не строкой, содержащей имя функции. Для примитивных значений, вроде 1, true или "test", значение доступно только для чтения.
  2. Свойство constructor (Object) (JavaScript): Задает функцию, которая создает объект. Комментарии: Свойство constructor является членом прототипа каждого объекта, у которого есть прототип. Это включает все встроенные объекты JavaScript, за исключением объектов Global и Math. Свойство constructor содержит ссылку на функцию, которая создает экземпляры данного конкретного объекта.

В первом пункте я не понял, что они подразумевают под словосочетанием ...создавшую прототип экземпляра.

Пример, на основе которого буду наглядно разбирать пункт 1.

function Class() {} 
 
var exemplar = new Class;

Объект(экземпляр) exemplar был создан на основе конструктора Class. Он унаследовал из своего конструктора свойство prototype в виде __proto__ (я его затрону ниже), в котором находиться свойство constructor. Внутри этого свойство находиться ссылка на конструктор Class.

Вернусь к определению первого пункта: Возвращает ссылку на функцию Object, создавшую прототип экземпляра. Функция Object, а точнее конструктор создает объект(экземпляр) в первую очередь, а потом ему присваивается уже prototype конструктора в виде __proto__. Просто в определении ставят акцент на том, что конструктор создает только прототип экземпляра, а не экземпляр в частности.

Во втором пункте я не понял ...экземпляры данного конкретного объекта. Не пойму о каком объекте идет речь, так как Object является функцией - конструктором. Я знаю что конструкторы Array, Object, Function создают разные сущности, а точнее Array - массив, Object - объект, Function - функцию и все они являются объектами кроме примитивов, но только если они не созданы через свои конструкторы Number, String и тд. P.S: Свойство constructor содержит ссылку на функцию, которая создает экземпляры данного конкретного объекта. Если это определение писалась на основе какого - то объекта, то вроде все понятно. К примеру есть объект exemplar из примера выше и его класс Class, а теперь разбираем определение в контексте этого экземпляра: Свойство constructor(exemplar.__proto__.constructor) содержит ссылку на функцию(Class), которая создает экземпляры данного конкретного объекта(exemplar)

Свойство prototype.

  1. Object.prototype: Свойство Object.prototype представляет объект прототипа Object.
  2. Свойство prototype (Object) (JavaScript): Возвращает ссылку на прототип класса объектов. Комментарии: Свойство prototype используется для предоставления базового набора функциональных возможностей классу объектов. Новые экземпляры объекта наследуют поведение прототипа, присвоенного этому объекту.

В первом пункте словосочетание: ...представляет объект прототипа Object мне не понятно. В моем понимаю это должно звучать как: Свойство Object.prototype предназначено для предоставления базового функционала экземплярам класса Object.

Во втором пункте мне не понятна формулировка: ...прототип класса объектов. По моему она должна звучать как: Возвращает ссылку на прототип экземпляров класса Object. Так же мне не понятно словосочетание ...классу объектов. Уместней было перефразировать в: Свойство prototype используется для предоставления базового набора функциональных возможностей экземплярам конкретного класса.

Итог.

  • Свойство prototype предназначено для предоставления базового функционала экземплярам класса. Оно используется в функциях - конструкторах(классах) по причине того, что при вызове конструктора через оператор new, экземпляр унаследует свойство prototype в виде свойства __proto__ которое является прототипом. Это сделано для того, что бы все экземпляры которые могут отличаться от друг друга, могли иметь общие свойства, которые характерны этому классу.

  • Свойство constructor является членом свойства prototype (prototype.constructor). В нем находиться ссылка на класс, который создает экземпляры. К примеру у нас есть функция - конструктор(класс) Class и его экземпляр exemplar, который унаследовал свойство prototype в виде __proto__. Внутри прототипа находиться свойство constructor которое будет указывать на класс Class который создал это экземпляр.

Я бы хотел что бы вы мне пояснили на сколько правильно я понял эти два свойства. Хотелось бы еще, что бы вы мне помогли понять смысл терминов, которые я привел выше из сайтов Мозили и Майкрософт, а то мне не очень понятно их трактовка.

READ ALSO
Как собрать все файлы js в один на gulp? [требует правки]

Как собрать все файлы js в один на gulp? [требует правки]

Хочу собрать мои скрипты и подключаемые библиотеки в один js файл с помощью gulpПодскажите

253
JavaScript - пинг сервера

JavaScript - пинг сервера

Как на javascript получить пинг определенного сервера в браузере? Пробовал через XMLHttpRequest - выдает ошибку 'No-Acces-Allow-Origin' или 'No HTTPS Connection'

531
Как сгрупировать результаты выбрки в Sphinx (php)

Как сгрупировать результаты выбрки в Sphinx (php)

Доброе время суток господа, возник такой вопрос: Есть php SphinxClient Есть вот такой запрос который идеально отрабатывает:

291
Как сменить пользователя в ru.stackowerflow.com? [требует правки]

Как сменить пользователя в ru.stackowerflow.com? [требует правки]

Хочу зайти в свой профиль, но не нашел кнопки выхода из этого профиля

308