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

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

Жанры

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) {

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

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Хозяин Теней

Петров Максим Николаевич
1. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Мастер Трав III

Мордорский Ваня
3. Мастер Трав
Фантастика:
фэнтези
рпг
фантастика: прочее
попаданцы
5.75
рейтинг книги
Мастер Трав III

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

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

Чехов книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Чехов книга 3

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Страж Кодекса. Книга VI

Романов Илья Николаевич
6. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга VI

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Наномашины, Кошмар Академии! Том 10

Новиков Николай Васильевич
10. Первый среди карапузов
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Наномашины, Кошмар Академии! Том 10

Ким

Киплинг Редьярд Джозеф
Приключения:
исторические приключения
7.62
рейтинг книги
Ким

Его звали Тони. Книга 5

Кронос Александр
5. Щенки косуль
Фантастика:
городское фэнтези
технофэнтези
попаданцы
7.00
рейтинг книги
Его звали Тони. Книга 5

Эпоха Опустошителя. Том V

Павлов Вел
5. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том V