Метод класса – это метод, связанный с классом, а не с экземпляром класса; онвызывается через сам класс, а не через конкретный экземпляр класса. Метод Date.parse() (описываемый в третьей части книги) – это метод класса. Он всегда вызывается через объект конструктора Date, а не через конкретный экземпляр класса Date.
Поскольку методы класса вызываются через функцию_конструктор, они не могут использовать ключевое слово this для ссылки на какой_либо конкретный экземп_ ляр класса, поскольку в данном случае this ссылается на саму функцию_конст_ руктор. (Обычно ключевое слово this в методах классов вообще не используется.)
Как и свойства класса, методы класса являются глобальными. Методы класса не работают с конкретным экземпляром, поэтому их, как правило, проще рассмат_ ривать в качестве функций, вызываемых через класс. Как и в случае со свойст_ вами класса, связь этих функций с классом дает им в пространстве имен Java_ Script удобную нишу и предотвращает возникновение конфликтов имен. Для то_ го чтобы определить метод класса в JavaScript, требуется сделать соответствую_ щую функцию свойством конструктора.
Пример: класс Circle
В примере 9.1 приводится программный код функции_конструктора и объекта_ прототипа, используемых для создания объектов, представляющих круг. Здесь можно найти примеры свойств экземпляра, методов экземпляра, свойств класса и методов класса.
Пример 9.1. Класс Circle
// Начнем с конструктора. function Circle(radius) {
// r – свойство экземпляра, оно определяется
// и инициализируется конструктором.
this.r = radius;
}
// Circle.PI – свойство класса, т. е. свойство функции_конструктора. Circle.PI = 3.14159;
// Метод экземпляра, который рассчитывает площадь круга. Circle.prototype.area = function( ) { return Circle.PI * this.r * this.r; }
// Метод класса – принимает два объекта Circle и возвращает объект с большим радиусом. Circle.max = function(a,b) {
Глава 9. Классы, конструкторы и прототипы
if (a.r > b.r) return a;
else return b;
}
// Примеры использования каждого
из этих полей:
var c
= new Circle(1.0);
//
Создание экземпляра класса Circle
c.r =
2.2;
//
Установка свойства экземпляра r
var a
= c.area();
//
Вызов метода экземпляра area()
var x
= Math.exp(Circle.PI);
//
Обращение к свойству PI класса для выполнения расчетов
var d
= new Circle(1.2);
//
Создание другого экземпляра класса Circle
var bigger = Circle.max(c,d); //
Вызов метода класса max()
Пример: комплексные числа
В примере 9.2 представлен еще один способ определения класса объектов в Java_ Script, но несколько более формальный, чем предыдущий. Код и комментарии достойны тщательного изучения.
Пример 9.2. Класс комплексных чисел
/*
* Complex.js:
* В этом файле определяется класс Complex для представления комплексных чисел.
* Вспомним, что комплексное число – это сумма вещественной и мнимой
* частей числа, и что мнимое число i – это квадратный корень из _1.
*/
/*
* Первый шаг в определении класса – это определение функции_конструктора
* класса. Этот конструктор должен инициализировать все свойства
* экземпляра объекта. Это неотъемлемые "переменные состояния",
* делающие все экземпляры класса разными.
*/
function Complex(real, imaginary) {
this.x = real; // Вещественная часть числа
this.y = imaginary; // Мнимая часть числа
}
/*
* Второй шаг в определении класса – это определение методов экземпляра
* (и возможно других свойств) в объекте_прототипе конструктора.
* Любые свойства, определенные в этом объекте, будут унаследованы всеми
* экземплярами класса. Обратите внимание, что методы экземпляра
* неявно работают с ключевым словом this. Для многих методов никаких
* других аргументов не требуется.
*/
// Возвращает модуль комплексного числа. Он определяется как расстояние
// на комплексной плоскости до числа от начала координат (0,0). Complex.prototype.magnitude = function() {
return Math.sqrt(this.x*this.x + this.y*this.y);
};
// Возвращает комплексное число с противоположным знаком. Complex.prototype.negative = function() {
9.3. Объектно*ориентированный язык JavaScript
return new Complex(_this.x, _this.y);
};
// Складывает данное комплексное число с заданным и возвращает
// сумму в виде нового объекта.
Complex.prototype.add = function(that) {
return new Complex(this.x + that.x, this.y + that.y);
}
// Умножает данное комплексное число на заданное и возвращает
// произведение в виде нового объекта. Complex.prototype.multiply = function(that) {