JavaScript. Подробное руководство, 6-е издание
Шрифт:
*/
// Складывает комплексное число that с текущим и возвращает сумму в виде нового объекта.
Complex.prototype.add = function(that) {
return new Complex(this.r + that.r, this.і + that.і);
};
// Умножает текущее комплексное число на число that и возвращает произведение.
Complex.prototype.mul = function(that) {
return new Complex(this.r * that.r - this.і * that.і, this.r * that.і + this.і * that.r);
}:
//
Возвращает вещественный модуль комплексного числа. Он определяется
// как расстояние до числа на комплексной плоскости от точки (0.0).
Complex.prototype.mag = function {
return Math.sqrt(this.r*this.r + this.i*this.i);
};
// Возвращает комплексное число с противоположным знаком.
Complex.prototype.neg = function { return new Complex(-this.r, -this.i); };
// Преобразует объект Complex в строку в понятном формате.
Complex.prototype.toString = function {
return "{" + this.r + "," + this.i + '}';
};
// Проверяет равенство данного комплексного числа с заданным.
Complex.prototype.equals = function(that) {
return that != null && // должно быть определено, не равно null
that.constructor === Complex && // и быть экземпляром Complex
this.r === that.r && this.i === that.i; // и иметь те же значения.
};
/*
* Поля класса (например, константы) и методы класса определяются как свойства
* конструктора. Обратите внимание, что в методах класса вообще не используется
* ключевое слово this: они выполняют операции только со своими аргументами.
*/
// Ниже определяется несколько полей класса, хранящих предопределенные
// комплексные числа. Их имена состоят исключительно из заглавных символов,
// чтобы показать, что они являются константами.
// (В ECMAScript 5 эти свойства можно было бы сделать доступными только для чтения)
Complex.ZERO = new Complex(0,0);
Complex.ONE = new Complex(1,0);
Complex.I = new Complex(0,1);
//
Следующий метод анализирует строку в формате, возвращаемом методом
// экземпляра toString, и возвращает объект Complex или возбуждает исключение ТуреЕггог.
Complex.parse = function(s) {
try { // Предполагается, что анализ пройдет успешно
var m = Complex._format.exec(s); // Регулярное выражение
return new Complex(parseFloat(m[1]), parseFloat(m[2]));
} catch (x) { // Возбудить исключение в случае неудачи
throw new TypeError("Строка + s + "' не может быть преобразована” +
в комплексное число.");
}
};
// "Частное" поле класса, используемое методом Complex.parse.
// Символ подчеркивания в его имени указывает, что оно предназначено
// для внутреннего использования и не является частью общедоступного API класса.
Complex._format = /^\{([^,]+),([^}]+)\}$/;
Определение класса Complex, представленное в примере 9.3, позволяет использовать конструктор, поля экземпляра, методы экземпляров, поля класса и методы класса, как показано ниже:
var с = new Complex(2,3); // Создать новый объект с помощью конструктора
var d = new Complex(c.i.c.r); // Использовать свойства экземпляра с
c.add(d).toString; // => "{5.5}": использовать методы экземпляров
// Более сложное выражение, в котором используются метод и поле класса
Complex.parse(c.toStringO). // Преобразовать с в строку и обратно,
add(c.neg). // сложить с числом с противоположным знаком,
equals(Complex.ZERO) // и результат всегда будет равен нулю
Несмотря на то что язык JavaScript позволяет имитировать члены классов в стиле языка Java, тем не менее в Java существует множество особенностей, которые не поддерживаются классами в языке JavaScript. Во-первых, в методах экземпляров классов в языке Java допускается использовать поля экземпляра, как если бы они были локальными переменными, - в Java нет необходимости предварять их ссылкой
this
. В языке JavaScript такая возможность не поддерживается, но похожего эффекта можно добиться с помощью инструкции with (хотя это и не рекомендуется):
Поделиться с друзьями: