Учебник по JavaScript: ч.1: прототипы, наследование

Apr 18, 2021 18:55

Мои посты, связанные с этим постом:
1. JavaScipt: пример создания полифила
2. JavaScript: решение задачи добавления toString в словарь

Прочел восьмой раздел («Прототипы, наследование») первой части («Язык программирования JavaScript») учебника по JavaScript.

https://learn.javascript.ru

Часть 1. Язык программирования JavaScript (в т.ч. 93 подраздела)

Разделы:

8. Прототипы, наследование (4 подраздела)

8.1 Прототипное наследование
8.2 F.prototype
8.3 Встроенные прототипы
8.4 Методы прототипов, объекты без свойства __proto__

Язык JavaScript кроме того, что заточен под программирование с помощью функций (процедурное программирование), еще является объектно-ориентированным. А одним из главных принципов (концепций) объектно-ориентированного программирования (ООП) является наследование, заключающееся в том, что объект-потомок имеет доступ к свойствам и методам объекта-родителя, а также может иметь свои собственные свойства и методы. Таким образом, программисту не нужно каждый раз писать все объекты с нуля, достаточно взять объекты, написанные им или другими программистами ранее и использовать их, либо добавить новые свойства и методы к объекту-родителю, создав объект-потомок. Наследование уменьшает время на создание новой программы.

В языке JavaScript объект-родитель называется прототипом. У каждого объекта есть скрытое свойство [[Prototype]], которое либо указывает на объект-родитель, либо равно специальному значению null (это означает, что у объекта нет объекта-родителя). Множественное наследование (когда у объекта больше одного объекта-родителя), как я понимаю, в JavaScript невозможно (в отличие, к примеру, от языка C++). Одним из способов изменить значение скрытого свойства [[Prototype]] является свойство-аксессор __proto__ (про свойства-аксессоры рассказывалось в подразделе 7.2 «Свойства - геттеры и сеттеры» учебника).

В подразделе 8.2 «F.prototype» рассказано про еще один способ изменить скрытое свойство [[Prototype]] объекта. Этот способ работает при создании нового объекта с помощью функции-конструктора (про функции-конструкторы рассказывалось в подразделе 4.5 «Конструкторы, создание объектов через "new"» учебника). Синтаксически функция-конструктор ничем не отличается от любой другой функции. Поэтому свойство prototype, нужное для конструирования нового объекта, есть у каждой функции в языке JavaScript. Это свойство по умолчанию содержит ссылку на объект с единственным свойством constructor, указывающим обратно на функцию-конструктор (это сделано для того, чтобы можно было определить, с помощью какой функции-конструктора был создан данный объект). При создании нового объекта с помощью функции-конструктора объектом-родителем нового объекта становится объект, указанный в свойстве prototype функции-конструктора.

В подразделе 8.3 «Встроенные прототипы» рассказано про то, как устроены встроенные в движок функции-конструкторы Object, Array, Function, Number и так далее. Все эти встроенные функции-конструкторы и встроенные объекты состоят в одной иерархии, наследуя друг от друга. На вершине этой иерархии находится объект, на который указывает свойство Object.prototype. Из этого подраздела можно понять, как устроен язык JavaScript.

В подразделе 8.4 «Методы прототипов, объекты без свойства __proto__» рассказано про современные способы изменения скрытого свойства [[Prototype]] объекта (перечисленные выше способы с помощью свойства-аксессора __proto__ объекта и с помощью свойства prototype функции-конструктора при создании нового объекта считаются устаревающими). Эти современные способы заключаются в использовании методов Object.create, Object.getPrototypeOf и Object.setPrototypeOf.

Образование, Программирование

Previous post Next post
Up