// для внутреннего использования и не является частью общедоступного 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 в цикле, количество итераций равно самому числу;
// при этом функции каждый раз передается номер итерации
// Например, чтобы вывести "привет" 3 раза:
// var n = 3;
// n.times(function(n) { console.log(n + " привет"); });
Number.prototype.times = function(f, context) {
var n = Number(this);
for(var і = 0; і < n; i++) f.call(context, i);
};
// Определяет метод ES5 String.trim(), если он отсутствует.
// Этот метод удаляет пробельные символы в начале и в конце строки и возвращает ее.
String.prototype.trim = String.prototype.trim || function() {
if (!this) return this; // He изменять пустую строку
Читать дальше
Конец ознакомительного отрывка
Купить книгу