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

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

Жанры

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

6.5. Перечисление свойств

Вместо проверки наличия отдельных свойств иногда бывает необходимо обойти все имеющиеся свойства или получить список всех свойств объекта. Обычно для этого используется цикл

for/in
, однако стандарт ECMAScript 5 предоставляет две удобные альтернативы.

Инструкция цикла

for/in
рассматривалась в разделе 5.5.4. Она выполняет тело цикла для каждого перечислимого свойства (собственного или унаследованного) указанного объекта, присваивая имя свойства переменной цикла. Встроенные методы, наследуемые объектами, являются неперечислимыми, а свойства, добавляемые в объекты вашей программой, являются перечислимыми (если только не использовались функции, описываемые ниже, позволяющие сделать свойства неперечислимыми). Например:

var о = {х:1, у:2, z:3}; // Три собственных перечислимых свойства

о.propertyIsEnumerable("toString") // => false: неперечислимое

for(p in о) // Цикл по свойствам

console.log(p); // Выведет х, у и z, но не toString

Некоторые библиотеки добавляют новые методы (или другие свойства) в объект

Object.prototype
, чтобы они могли быть унаследованы и быть доступны всем объектам. Однако до появления стандарта ECMAScript 5 отсутствовала возможность сделать эти дополнительные методы неперечислимыми, поэтому они оказывались доступными для перечисления в циклах
for/in
. Чтобы решить эту проблему, может потребоваться фильтровать свойства, возвращаемые циклом
for/in
. Ниже приводятся два примера реализации такой фильтрации:

fог(р in о) {

if (!о.hasOwnProperty(p)) continue; // Пропустить унаследованные свойства

}

for(p in о) {

if (typeof о[р] === "function”) continue; // Пропустить методы

}

В примере 6.2 определяются вспомогательные функции, использующие цикл for/in для управления свойствами объектов. Функция extend, в частности, часто используется в библиотеках JavaScript. [9]

9

Функция extend, представленная здесь, реализована правильно, но она не компенсирует хорошо известную проблему в Internet Explorer. Более надежная версия функции extend будет представлена в примере 8.3.

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

/*

* Копирует перечислимые свойства из объекта р в объект о и возвращает о.

* Если о и р имеют свойства с одинаковыми именами, значение свойства

* в объекте о затирается значением свойства из объекта р.

* Эта функция не учитывает наличие методов доступа и не копирует атрибуты.

*/

function extend(o, р) {

fоr(ргор in р) { // Для всех свойств в р.

о[ргор] = р[prop]; // Добавить свойство в о.

}

return о;

}

/*

* Копирует перечислимые свойства из объекта р в объект о и возвращает о.

* Если о и р имеют свойства с одинаковыми именами, значение свойства

* в объекте о остается неизменным.

* Эта функция не учитывает наличие методов доступа и не копирует атрибуты.

*/

function merge(o, р) {

fоr(ргор in р) { // Для всех свойств в р.

if (о.hasOwnProperty[prop]) continue; // Кроме имеющихся в о.

о[prop] = р[prop]; // Добавить свойство в о.

}

return о;

}

/*

* Удаляет из объекта о свойства, отсутствующие в объекте р.

* Возвращает о.

*/

function restricts, р) {

fоr(prop in о) { // Для всех свойств в о

if (!(prop in р)) delete о[prop]; // Удалить, если отсутствует в р

}

return о;

}

/*

* Удаляет из объекта о свойства, присутствующие в объекте р. Возвращает о.

*/

function subtracts, р) {

for(prop in р) { // Для всех свойств в р

delete о[ргор]; // Удалить из о (удаление несуществующих

// свойств можно выполнять без опаски)

}

return о;

}

/*

* Возвращает новый объект, содержащий свойства, присутствующие хотя бы в одном

* из объектов, о или р. Если оба объекта, о и р, имеют свойства с одним

* и тем же именем, используется значение свойства из объекта р.

*/

function union(o,p) { return extend(extend({},о), p); }

/*

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

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

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

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

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

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

Идеальный мир для Лекаря 26

Сапфир Олег
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 26

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

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

Моров. Том 4

Кощеев Владимир
3. Моров
Фантастика:
фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 4

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Хозяин Теней 7

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

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда

Хозяин Теней 6

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

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Антология странного рассказа

Коллектив авторов
Проза:
современная проза
5.00
рейтинг книги
Антология странного рассказа

Ведун

Сухов Александр Евгеньевич
1. Второй шанс
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Ведун

Гром Раскатного. Том 2

Володин Григорий Григорьевич
2. Штормовой Предел
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гром Раскатного. Том 2