Книга: JavaScript. Подробное руководство, 6-е издание
9.1. Классы и прототипы
9.1. Классы и прототипы
В языке JavaScript класс - это множество объектов, наследующих свойства от общего объекта-прототипа. Таким образом, объект-прототип является центральной особенностью класса. В примере 6.1 была определена функция inherit(),
возвращающая вновь созданный объект, наследующий указанный объект-прототип. Если определить объект-прототип и затем воспользоваться функцией inherit()
для создания объектов, наследующих его, фактически будет создан класс JavaScript. Обычно экземпляры класса требуют дополнительной инициализации, поэтому обычно определяется функция, которая создает и инициализирует новые объекты. В примере 9.1 демонстрируется такая функция: она определяет объект-прототип класса, представляющего диапазон значений, а также «фабричную» функцию, которая создает и инициализирует новые экземпляры класса.
Пример 9.1. Простой класс JavaScript
// range.js: Класс, представляющий диапазон значений.
// Это фабричная функция, которая возвращает новый объект range,
function range(from, to) {
// Использует функцию inherit() для создания объекта, наследующего объект-прототип,
// определяемый ниже. Объект-прототип хранится как свойство данной функции
// и определяет общие методы (поведение) для всех объектов range,
var r = inherit(range.methods);
// Сохранить начальное и конечное значения в новом объекте range.
// Это не унаследованные свойства, и они являются уникальными для данного объекта,
r.from = from;
r.to = to;
// В заключение вернуть новый объект
return r;
}
// Ниже следует объект-прототип, определяющий методы, наследуемые всеми объектами range,
range.methods = {
// Возвращает true, если х - объект класса range, в противном случае возвращает false
// Этот метод может работать не только с числовыми диапазонами,
// но также с текстовыми диапазонами и с диапазонами дат Date,
includes: function(x) { return this.from <= x && x <= this.to; },
// Вызывает f для каждого целого числа в диапазоне.
// Этот метод может работать только с числовыми диапазонами,
foreach: function(f) {
for(var х = Math.ceil(this.from); x <= this.to; x++) f(x);
}
// Возвращает строковое представление диапазона
toString: function() { return "(" + this.from + "..." + this.to + ")" }
}
// Ниже приводится пример использования объекта range.
var r = range(1,3); // Создать новый объект range
r.includes(2); // => true: число 2 входит в диапазон
r.foreach(console.log);// Выведет 1 2 3
console.log(r); // Выведет (1...3)
В примере 9.1 есть несколько интересных моментов, которые следует отметить особо. Здесь определяется фабричная функция range(),
которая используется для создания новых объектов range
. Обратите внимание, что для хранения объекта-прототипа, определяющего класс, используется свойство range.methods
функции range().
В таком способе хранения объекта-прототипа нет ничего необычного. Во-вторых, отметьте, что функция range()
определяет свойства from
и to
для каждого объекта range
. Эти не общие, не унаследованные свойства определяют уникальную информацию для каждого отдельного объекта range. Наконец, обратите внимание, что все общие, унаследованные методы, определяемые свойством range.methods
, используют свойства from
и to
и ссылаются на них с помощью ключевого слова this
, указывающего на объект, относительно которого вызываются эти методы. Такой способ использования this является фундаментальной характеристикой методов любого класса.
- Классы сертификатов
- У14.6 Отложенные классы и прототип
- Классы коллекций и связанные типы
- 9 Классы и модули
- Прототипы
- Глава 3. Классы P и NP
- Глава 3. Классы
- Классы памяти
- Статические классы
- 9.8. Классы в ECMAScript 5
- 9.7.4. Иерархии классов и абстрактные классы
- Классы синхронизации, внедренные в версии .NET Framework 4.0