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

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

Шрифт:

includes: function(x) {

return this.from <= x && x <= this.to: },

foreach: function(f) {

for(var x=Math.ceil(this.from);x<=this.to;x++) f(x);},

toString: function { return "(" + this, from + ”..." + this, to + ")"; }

});

9.8.4. Предотвращение расширения класса

Возможность расширения классов за счет добавления новых методов в объект-прототип обычно рассматривается как характерная особенность языка JavaScript. Стандарт ECMAScript 5 позволяет при желании предотвратить такую возможность. Функция

Object.preventExtensions
делает объект нерасширяемым (раздел 6.8.3) - в такой объект невозможно добавить новые свойства. Функция
Object.seal
идет еще дальше: она не только предотвращает добавление новых свойств, но и делает все имеющиеся свойства ненастраиваемыми, предотвращая возможность их удаления. (Однако ненастраиваемое свойство по-прежнему может быть доступно для записи и по-прежнему может быть преобразовано в свойство, доступное только для чтения.) Чтобы предотвратить возможность расширения объекта
Object.prototype
, можно просто записать:

Object.seal(Object.prototype);

Другая динамическая особенность языка JavaScript - возможность замены методов объекта:

var original_sort_method = Array.prototype.sort;

Array.prototype.sort = function {

var start = new Date;

original_sort_method.apply(this, arguments);

var end = new Date;

console.log("Сортировка массива заняла " + (end - start) +

" миллисекунд.");

};

Предотвратить такую замену можно, объявив методы экземпляров доступными только для чтения. Сделать это можно с помощью вспомогательной функции

freezeProps,
объявленной выше. Другой способ добиться этого эффекта заключается в использовании функции
Object.freeze,
которая выполняет те же действия, что и функция
Object.seal,
и дополнительно делает все свойства ненастраиваемыми и доступными только для чтения.

Свойства, доступные только для чтения, обладают одной особенностью, о которой необходимо помнить при работе с классами. Если объект

о
наследует свойство
р
, доступное только для чтения, попытка присвоить значение свойству
о.р
будет завершаться неудачей без создания нового свойства в объекте
о
. Если потребуется переопределить унаследованное свойство, доступное только для чтения, можно воспользоваться функциями
Object.defineProperty, Object.defineProperties
или
Object.create,
чтобы создать новое свойство. Это означает, что, когда методы экземпляров класса делаются доступными только для чтения, это существенно осложняет возможность их переопределения в подклассах.

На практике обычно не требуется блокировать возможность изменения объектов-прототипов таким способом, но в некоторых случаях предотвращение расширения объектов может оказаться полезным. Вспомните фабричную функцию

enumeration
из примера 9.7. Она сохраняет все экземпляры перечислений в свойствах объекта-прототипа и в свойстве-массиве
values
конструктора. Эти свойства и массив играют роль официального перечня экземпляров перечислений, и их определенно имеет смысл зафиксировать, чтобы исключить возможность добавления новых экземпляров и изменения или удаления существующих. Для этого достаточно добавить в функцию
enumeration
следующие строки:

Object.freeze(enumeration.values);

Object.freeze(enumeration);

Обратите внимание, что применение функции

Object.freeze
к типу перечисления исключает возможность использования свойства
objectId
, как было показано в примере 9.17. Решение этой проблемы состоит в том, чтобы прочитать значение свойства
objectId
(вызвать соответствующий метод чтения и установить внутреннее свойство) перечисления только один раз, перед тем как его зафиксировать.

9.8.5. Подклассы и ECMAScript 5

В примере 9.22 демонстрируется порядок создания подклассов с использованием возможностей ECMAScript 5. В нем определяется класс

stringSet,
наследующий класс
AbstractWritableSet
из примера 9.16. Основная особенность этого примера заключается в использовании функции
Object.сreate
для создания объекта-прототипа, наследующего прототип суперкласса, и в определении свойств вновь созданного объекта. Как уже отмечалось выше, основная сложность этого подхода заключается в необходимости использовать неудобные дескрипторы свойств.

  • Читать дальше
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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