Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

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 изменять пустую строку

return this.replace(/^\s+|\s+$/g, ""); // Регулярное выражение

};

// Возвращает имя функции. Если функция имеет свойство name (нестандартное),

// возвращает его значение. Иначе преобразует функцию в строку и извлекает имя из нее.

// Для неименованных функций возвращает пустую строку.

Function.prototype.getName = function {

return this.name || this.toString.match(/function\s*([^(]*)\(/)[1];

};

Методы можно также добавлять в

Object, prototype
, тем самым делая их доступными для всех объектов. Однако делать это не рекомендуется, потому что в реализациях, появившихся до ECMAScript 5, отсутствует возможность сделать эти дополнительные методы неперечислимыми. При добавлении новых свойств в
Object.prototype
они становятся доступны для перечисления в любом цикле
for/in
. В разделе 9.8.1 приводится пример использования метода
Object.defineProperty
, определяемого стандартом ECMAScript 5, для безопасного расширения
Object, prototype
.

  • Читать дальше
  • 1
  • ...
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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