JavaScript. Подробное руководство, 6-е издание
Шрифт:
Пример 9.17. Определение неперечислимых свойств
// Обертывание программного код функцией позволяет определять переменные
// в области видимости функции
(function {
// Определить свойство objectId как неперечислимое и наследуемое
// всеми объектами. При попытке получить значение этого свойства
// вызывается метод чтения. Свойство не имеет метода записи, поэтому
// оно доступно только для чтения. Свойство определяется как ненастраиваемое,
// поэтому его нельзя удалить.
Object.defineProperty(Object.prototype, "objectld", {
get: idGetter, // Метод чтения значения
enumerable: false, // Неперечислимое
configurable: false // He может быть удалено
});
// Функция чтения, которая вызывается при попытке получить значение
// свойства objectld
function idGetter { // Функция чтения, возвращающая id
if (!(idprop in this)) { // Если объект еще не имеет id
if (!Object.isExtensible(this)) // И если можно добавить свойство
throw Error("Нельзя определить id нерасширяемого объекта”);
Object.defineProperty(this, idprop, { // Добавить его.
value: nextid++, // Значение
writable: false, // Только для чтения
enumerable: false, // Неперечислимое
configurable: false // Неудаляемое
}):
}
return this[idprop]; // Вернуть существующее или новое значение
};
// Следующие переменные используются функцией idGetter и являются
// частными для этой функции
var idprop = "|**objectId**|"; // Предполагается, что это свойство
// больше нигде не используется
var nextid = 1; // Начальное значение для id
}); // Вызвать функцию-обертку, чтобы выполнить программный код
9.8.2. Определение неизменяемых классов
Помимо возможности делать свойства неперечислимыми, стандарт ECMAScript 5 позволяет делать свойства доступными только для чтения, что может быть довольно удобно при создании классов, экземпляры которых не должны изменяться. В примере 9.18 приводится неизменяемая версия класса
Range
, который использует эту возможность, применяя функции Object.defineProperties
и Object.create.
Кроме того, функция Object.defineProperties
используется в нем также для добавления свойств в объект-прототип класса, что делает методы экземпляров недоступными для перечисления, подобно методам встроенных классов. Но и это еще не все: определяемые в примере методы экземпляров создаются доступными только для чтения и не могут быть удалены, что исключает возможность динамического изменения класса. Наконец, в примере 9.18 использован один интересный трюк - при вызове без ключевого слова new
функция-конструктор класса действует как фабричная функция. Пример 9.18. Неизменяемый класс со свойствами и методами, доступными только для чтения
// Эта функция может работать и без ключевого слова 'new': она одновременно
// является и конструктором, и фабричной функцией
function Range(from,to) {
// Дескрипторы свойств from и to, доступных только для чтения,
var props = {
from: {value:from, enumerable:true,writable:false,configurable:false},
to: {value:to, enumerable:true, writable:false, configurable:false}
};
if (this instanceof Range) // Если вызвана как конструктор
Object.defineProperties(this, props): // Определить свойства
else // Иначе как фабричная функция
return Object.create(Range.prototype, // Создать и вернуть новый
props): // объект Range со свойствами
}
// Если добавлять свойства в объект Range.prototype тем же способом, можно будет
// определить атрибуты этих свойств. Поскольку мы не указываем атрибуты enumerable,
// writable и configurable, они по умолчанию получают значение false.
Object.defineProperties(Range.prototype, {
includes: {
value: function(x) { return this.from <= x && x <= this.to: }
),
foreach: {
value: function(f) {
Поделиться:
Популярные книги
Вперед в прошлое 7
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Око василиска
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великие мифы и легенды. 100 историй о подвигах, мире богов, тайнах рождения и смерти
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Последний Паладин. Том 7
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неучтенный элемент. Том 9
9. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Память льда
3. «Малазанская империя»
Фантастика:
фэнтези
6.00
рейтинг книги
Личный аптекарь императора. Том 3
3. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Будущее разума
Научно-образовательная:
прочая научная литература
физика
8.00
рейтинг книги
Бастард Императора. Том 15
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Убивать чтобы жить 3
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Кодекс Крови. Книга IХ
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Узы крови
Детективы:
прочие детективы
9.30
рейтинг книги
Адвокат
1. Бандитский Петербург
Детективы:
боевики
8.00