[Перевод] Понимание ООП на джаваскрипте (ES5), часть 2

aed2a06402be412f9fd4c63e7a048f26.pngЗамечания о переводеПоднимаю продолжение заброшенного перевода, поскольку вопросы в оригинале вплотную переплетаются с вопросами наследования, сделанными в собственной компактной библиотеке для использования без фреймворков, имеющих поддержку ООП. Пусть то и другое не оригинально, но вместе даёт понимание работы наследования. Для полноты статьи и единого стиля, перевод начинается с вопросов наследования, несмотря на то, что они уже были упомянуты в конце первой части. Далее рассматриваются разнообразные задачи наследования так, как их рассмотрел автор. Надо сказать, что автор широко использует новые конструкции ES5 (объяснив это в конце), которые работают не во всех браузерах и заслоняют от понимания реализацию их на низком уровне языка, на котором они изначально применялись. Для настоящего понимания наследования следует обратиться к более глубокому разбору реализаций или к реализациям методов-обёрток из ES5: Object.create, Object.defineProperty, Function.bind, get и set literals, Object.getOwnPropertyNames, Object.defineProperty, Object.getOwnPropertyDescriptor, Object.getPrototypeOf. Часть их разбирается в статье (Object.create, get и set, Object.defineProperty, bind), но не всегда в порядке появления. Таким образом, статья стремится преподнести не реализацию наследования вообще, а ту реализацию, которую успели формализовать в рабочем черновике стандарта EcmaScript 5. Это лучше, чем ничего, но несколько меньше, чем полное понимание реализаций наследования. Зато, данная часть статьи в нескольких (4) крупных примерах кода демонстрирует чистейшее прототипное наследование, которому не требуется привлекать понятие конструктора (хотя он там, в .create (), незримо присутствует), о котором много говорят и которое исключительно редко в чистом виде встречается.Краткое содержание первой части1. Объекты   1.1 Что есть объекты? (список свойств)   1.2 Создание свойств (Object.defineProperty)   1.3 Описатели свойств (Object.defineProperty)   1.4 Разбор синтаксиса (bracket notation: object['property'])   1.5 Доступ к свойствам (через скобочную нотацию)   1.6 Удаление свойств (оператор delete)   1.7 Геттеры и сеттеры (методы доступа и записи)   1.8 Списки свойств (getOwnPropertyNames, keys)   1.9 Литералы (базовые операторы) объекта2. Методы   2.1 Динамический this   2.2 Как реализован this     2.2.1 Если вызывается как метод объекта     2.2.2 При обычном вызове функции (this === global)     2.2.3 При явном указании контекста (.apply, .call)   2.3 Привязывание методов к контексту (.bind)Cодержание части 23. Прототипное наследование   3.1 Прототипы   3.2 Как работает [[Prototype]]   3.3 Переопределение свойства   3.4 Миксины (примеси)   3.5 Доступ к экранированным ('перезаписанным') свойствамПлан части 34. Конструкторы   4.1 Магия оператора new   4.2 Наследование с конструкторами5. Соглашения и совместимость   5.1 Создание объектов   5.2 Определение свойств   5.3 Списки свойств   5.4 Методы связывания   5.5 Получение [⁣[Prototype]⁣]   5.6 Библиотеки обратной совместимости6. Синтаксические обёртки7. Что читать дальше8. Благодарности Примечания 3. Прототипное наследование До сих пор мы рассматривали, как определяются методы в объектах и как их повторно используют в других объектах при явном указании контекста, но это — всё же не лучший путь использования и расширения объектов. Далее в игру вступает наследование. Оно лучше разделяет понятия, когда объекты наделяются своими методами на основе методов других объектов. Прототипное наследование идёт дальше и может избирательно расширять методы, описывать общее поведение и использовать другие занятные приёмы, которых мы коснёмся. Печалит лишь то, что модель наследования в JS немного ограничена, и для обхода трудностей эти приёмы будут временами избыточны выносить мозг.afa19d045b2bce238895a5f2856f9174.gifдальше

© Habrahabr.ru