JavaScript. Подробное руководство, 6-е издание, стр. 124
<b>// Вспомогательный конструктор для класса Set.</b><b>function SetFromArray(a) {</b><b> // Инициализировать новый объект вызовом конструктора Set() как функции,</b><b> // передав ей элементы массива в виде отдельных аргументов.</b><b> Set.apply(this, а);</b><b>}</b><b>// Установить прототип, чтобы функция SetFromArray создавала экземпляры Set </b><b>SetFromArray.prototype = Set.prototype;</b><b>var s = new SetFromArray([1,2,3]);</b><b>s instanceof Set // => true</b>В ECMAScript 5 функции имеют метод
<b>bind(),</b>9.7. Подклассы
В объектно-ориентированном программировании класс В может расширять, или наследовать, другой класс А. Класс А в этом случае называется суперклассом, а класс В - подклассом. Экземпляры класса В наследуют все методы экземпляров класса А. Класс В может определять собственные методы экземпляров, некоторые из которых могут переопределять методы класса А с теми же именами. Если метод класса В переопределяет метод класса А, переопределяющий метод класса В может вызывать переопределенный метод класса А: этот прием называется вызовом метода базового класса. Аналогично конструктор В() подкласса может вызывать конструктор А() суперкласса. Это называется вызовом конструктора базового класса. Подклассы сами могут наследоваться другими подклассами и, работая над созданием иерархии классов, иногда бывает полезно определять абстрактные классы. Абстрактный класс - это класс, в котором объявляется один или более методов без реализации. Реализация таких абстрактных методов возлагается на конкретные подклассы абстрактного класса.
Ключом к созданию подклассов в языке JavaScript является корректная инициализация объекта-прототипа. Если класс В расширяет класс А, то объект В.prototype должен наследовать
<b>A.prototype</b><b>В.prototype</b><b>A.prototype</b>Используя в качестве основы класс
<b>Set</b><b>Set</b>9.7.1. Определение подкласса
В языке JavaScript объекты наследуют свойства (обычно методы) от объекта-прототипа своего класса. Если объект
<b>O</b><b>В</b><b>В</b><b>А</b><b>O</b><b>А</b><b>В</b><b>А</b><b>inherit()</b><b>В.prototype = inherit(A.prototype); // Подкласс наследует суперкласс</b><b>В.prototype.constructor = В; // Переопределить унаследованное св. constructor</b>Эти две строки являются ключом к созданию подклассов в JavaScript. Без них объект-прототип будет обычным объектом - объектом, наследующим свойства от
<b>Object.prototype</b><b>Object</b><b>defineClass()</b><b>defineSubclass()</b><b>Function.prototype.extend(),</b>Пример 9.11. Вспомогательные инструменты определения подклассов
<b>// Простая функция для создания простых подклассов</b><b>function defineSubclass(superclass, // Конструктор суперкласса</b><b> constructor, // Конструктор нового подкласса</b><b> methods, // Методы экземпл.: копируются в прототип</b><b> statics) // Свойства класса: копируются в констр-р</b><b>{</b><b> // Установить объект-прототип подкласса </b><b> constructor.prototype = inherit(superclass.prototype);</b><b> constructor.prototype.constructor = constructor;</b><b> // Скопировать методы methods и statics, как в случае с обычными классами</b><b> if (methods) extend(constructor.prototype, methods);</b><b> if (statics) extend(constructor, statics);</b><b> // Вернуть класс</b><b> return constructor;</b><b>}</b><b>// To же самое можно реализовать в виде метода конструктора суперкласса</b><b>Function.prototype.extend = function(constructor, methods, statics) {</b>