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

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

Жанры

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

Пример 8.4. Реализация методов доступа к частному свойству с использованием замыканий

// Эта функция добавляет методы доступа к свойству с заданным именем объекта о.

// Методы получают имена вида get<name> и set<name>. Если дополнительно предоставляется

// функция проверки, метод записи будет использовать ее для проверки значения

// перед сохранением. Если функция проверки возвращает false,

// метод записи генерирует исключение.

//

// Необычность такого подхода заключается в том, что значение свойства,

// доступного методам, сохраняется не в виде свойства объекта о, а в виде

// локальной переменной этой функции. Кроме того, методы доступа также определяются

// внутри этой функции и потому получают доступ к этой локальной переменной.

// Это означает, что значение доступно только этим двум методам и не может быть

// установлено или изменено иначе, как методом записи,

function addPrivateProperty(o, name, predicate) {

var value; // Это значение свойства

// Метод чтения просто возвращает значение.

о["get" + name] = function { return value; };

// Метод записи сохраняет значение или возбуждает исключение,

// если функция проверки отвергает это значение.

o["set" + name] = function(v) {

if (predicate && !predicate(v))

throw Error("set" + name + недопустимое значение + v);

else

value = v;

};

}

// Следующий фрагмент демонстрирует работу метода addPrivateProperty.

var о = {}; // Пустой объект

// Добавить к свойству методы доступа с именами getName и setName

// Обеспечить допустимость только строковых значений

addPrivateProperty(o, "Name", function(x) { return typeof x == "string"; });

o.setName("Frank"); // Установить значение свойства

console.log(o.getName); // Получить значение свойства

о.setName(0); // Попробовать установить значение свойства неверного типа

Мы увидели несколько примеров, когда замыкания определяются в одной и той же цепочке областей видимости и совместно используют одну локальную пере¬менную или переменные. Важно знать и уметь пользоваться этим приемом, но но менее важно уметь распознавать ситуации, когда замыкания получают перемен¬ную в совместное использование по ошибке. Рассмотрим следующий пример:

// Эта функция возвращает функцию, которая всегда возвращает v

function constfunc(v) { return function { return v; }; }

// Создать массив функций-констант:

var funcs = [];

for(var і = 0; і < 10; i++) funcs[i] = constfunc(i);

// Функция в элементе массива с индексом 5 возвращает 5.

funcs[5] // => 5

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

// Возвращает массив функций, возвращающих значения 0-9

function constfuncs { var funcs = [];

for(var і = 0; і < 10; i++)

funcs[i] = function { return i; };

return funcs;

}

var funcs = constfuncs;

funcs[5] // Что вернет этот вызов?

Функция выше создает 10 замыканий и сохраняет их в массиве. Замыкания образуются в одном и том же вызове функции, поэтому все они получат доступ к переменной і. Когда

constfuncs
вернет управление, переменная і будет иметь значение 10, и все 10 замыканий будут совместно использовать это значение. Таким образом, все функции в возвращаемом массиве будут возвращать одно и то же значение, что совсем не то, чего мы пытались добиться. Важно помнить, что цепочка областей видимости, связанная с замыканием, не фиксируется. Вложенные функции не создают частные копии области видимости и не фиксируют значения переменных.

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

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

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

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

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

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

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

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Справочник логопеда

Коллектив авторов
Научно-образовательная:
медицина
6.25
рейтинг книги
Справочник логопеда

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

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

Миротворец. Дипломатия Кланов

Пламенев Владимир
1. Миротворец
Фантастика:
историческое фэнтези
фэнтези
5.00
рейтинг книги
Миротворец. Дипломатия Кланов

Демон-хранитель

TsissiBlack
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
Демон-хранитель

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Последний Паладин. Том 11

Саваровский Роман
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 11

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

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

Хроники Тириса. Книга 3

Маханенко Василий Михайлович
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Хроники Тириса. Книга 3