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

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

Жанры

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

// Определение методов доступа, которые следят за соблюдением условия

function getFrom { return from; }

function getTo { return to; }

function setFrom(f) { // He позволяет устанавливать значение from > to

if (f <= to) from = f;

else throw new Error("Range: значение from должно быть <= to");

}

function setTo(t) { // He
позволяет устанавливать значение to < from

if (t >= from) to = t;

else throw new Error("Range: значение to должно быть >= from");

}

// Создать перечислимые, ненастраиваемые свойства с методами доступа

Object.defineProperties(this, {

from: {getigetFrom,

set:setFrom,

enumerable:true,

configurable:false},

to: { get: getTo,

set: setTo,

enumerable:true,

configurable:false }

});

}

// Настройка объекта-прототипа осталась такой же, как и в предыдущих примерах.

// Обращение к методам экземпляров чтения свойств from и to выполняется так,

// как если бы они были простыми свойствами.

Range.prototype = hideProps({

constructor: Range,

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
следующие строки:

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

Лекарь Империи 7

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

Психотехника рукопашной схватки

Калинин Виталий
Дом и Семья:
спорт
5.00
рейтинг книги
Психотехника рукопашной схватки

Ангел пролетел

Устинова Татьяна
Любовные романы:
5.00
рейтинг книги
Ангел пролетел

Неучтенный элемент. Том 12

NikL
12. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 12

Звездные судьбы (Исторические миниатюры)

Бестужева-Лада Светлана Игоревна
Научно-образовательная:
история
5.00
рейтинг книги
Звездные судьбы (Исторические миниатюры)

Жрец Хаоса. Книга III

Борзых М.
3. Зов пустоты
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга III

Собрание сочинений, том 15

Энгельс Фридрих
15. Собрание сочинений Маркса и Энгельса
Научно-образовательная:
философия
5.00
рейтинг книги
Собрание сочинений, том 15

Бастард Императора. Том 12

Орлов Андрей Юрьевич
12. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 12

Представь себе… Беседы о деньгах, политике и жизни вообще

Гьямцхо? Нгагва?нг Ловза?нг Тэнцзи?н
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Представь себе… Беседы о деньгах, политике и жизни вообще

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

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

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.57
рейтинг книги
Шайтан Иван

Преследование праведного грешника

Джордж Элизабет
10. Инспектор Линли
Детективы:
триллеры
криминальные детективы
8.00
рейтинг книги
Преследование праведного грешника

Некромантка

Руда Александра
5. Ола и Отто
Фантастика:
фэнтези
юмористическая фантастика
7.12
рейтинг книги
Некромантка

Сборник статей и интервью 2009г (v1.5)

Кагарлицкий Борис Юльевич
Научно-образовательная:
политика
5.00
рейтинг книги
Сборник статей и интервью 2009г (v1.5)