Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

*/

// Ниже определяется несколько полей класса, хранящих предопределенные

// комплексные числа. Их имена состоят исключительно из заглавных символов,

// чтобы показать, что они являются константами.

// (В 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 (хотя это и не рекомендуется):

Complex.prototype.toString = function {

with(this) {

return + r + " + і +

}

};

В языке Java поддерживается возможность объявлять поля со спецификатором

final
, чтобы показать, что они являются константами, и объявлять поля и методы со спецификатором
private
, чтобы показать, что они являются частными для реализации класса и недоступны пользователям класса. В языке JavaScript эти ключевые слова отсутствуют, поэтому, чтобы обозначить частные свойства (имена которых начинаются с символа подчеркивания) и свойства, доступные только для чтения (имена которых содержат только заглавные символы), в примере 9.3 используются соглашения по именованию. Мы еще вернемся к этим двум темами ниже в этой главе: частные свойства можно имитировать с помощью локальных переменных в замыканиях (раздел 9.6.6), а возможность определения свойств-констант поддерживается стандартом ECMAScript 5 (раздел 9.8.2).

9.4. Наращивание возможностей классов

Механизм наследования на основе прототипов, используемый в языке JavaScript, имеет динамическую природу: объекты наследуют все свойства своих прототипов, даже если они были добавлены в прототипы уже после создания объектов. Это означает, что в JavaScript имеется возможность наращивать возможности классов простым добавлением новых методов в объекты-прототипы. Ниже приводится фрагмент, который добавляет метод вычисления сопряженного комплексного числа в класс

Complex
из примера 9.3:

// Возвращает комплексное число, которое является сопряженным

// по отношению к текущему.

Complex.prototype.conj = function { return new Complex(this.r, -this.i); };

Объект-прототип встроенных классов JavaScript также «открыт» для подобного наращивания, а это означает, что есть возможность добавлять новые методы к числам, строкам, массивам, функциям и т. д. Данная возможность уже использовалась в примере 8.5. Там мы добавляли метод

bind
к классу функций в реализации ECMAScript 3, где он отсутствует:

if (!Function.prototype.bind) {

Function.prototype.bind = function(o /*, аргументы */) {

// Реализация метода bind...

};

}

Ниже приводятся несколько примеров расширения классов:

// Вызывает функцию f в цикле, количество итераций равно самому числу;

Поделиться:
Популярные книги

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

О, мой бомж

Джема
1. Несвятая троица
Любовные романы:
современные любовные романы
5.00
рейтинг книги
О, мой бомж

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Сумеречный Стрелок 5

Карелин Сергей Витальевич
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 5

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки