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

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

Жанры

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

var n = 0;

for(var name in this) {

if (!this.hasOwnProperty(name)) continue; // пропустить унаслед.

var value = this[name];

if (typeof value === ’function") continue; // пропустить методы

if (n++) s += ", ";

s += name + '=' + value;

}

return s + ']';

},

// Проверить равенство, сравнив конструкторы и свойства экземпляров объектов this

// и that. Работает только с классами, свойства экземпляров которых являются

// простыми значениями и могут сравниваться с помощью оператора ===.

// Игнорировать специальное свойство, добавляемое классом Set.

equals: function(that) {

if (that == null) return false;

if (this.constructor !== that.constructor) return false;

for(var name in this) {

if (name === "|**objectid**|") continue; // пропустить спец. св.

if (!this.hasOwnProperty(name)) continue; // пропустить унасл. св.

if (this[name] !== that[name]) return false; // сравнить значения

}

return true; // Объекты равны, если все свойства равны.

}

};

9.6.6. Частные члены

В классическом объектно-ориентированном программировании зачастую целью инкапсуляции, или сокрытия данных объектов внутри объектов, является обеспечение доступа к этим данным только через методы объекта и запрет прямого доступа к важным данным. Для достижения этой цели в таких языках, как Java, поддерживается возможность объявления «частных» (

private
) полей экземпляров класса, доступных только через методы экземпляров класса и невидимые за пределами класса.

Реализовать частные поля экземпляра можно с помощью переменных (или аргументов), хранящихся в замыкании, образуемом вызовом конструктора, который создает экземпляр. Для этого внутри конструктора объявляются функции (благодаря чему она получает доступ к аргументам и локальным переменным конструктора), которые присваиваются свойствам вновь созданного объекта. Этот прием демонстрируется в примере 9.10, где он используется для создания инкапсулированной версии класса

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

Пример 9.10. Класс Range со слабо инкапсулированными границами

function Range(from, to) {

// Не сохраняет границы в свойствах объекта. Вместо этого определяет функции доступа,

// возвращающие значения границ. Сами значения хранятся в замыкании,

this.from = function { return from; };

this.to = function { return to; };

}

// Методы прототипа не имеют прямого доступа к границам: они должны вызывать

// методы доступа, как любые другие функции и методы.

Range.prototype = { constructor: Range,

includes: function(x) { return this.from <= x && x <= this.to; },

foreach: function(f) {

for(var x=Math.ceil(this.from), max=this.to; x <= max: x++) f(x);

},

toString: function { return "(" + this.from + "..." + this.to + ")"}

};

Новый класс

Range
определяет методы для чтения значений границ диапазона, но в нем отсутствуют методы или свойства для изменения этих значений. Это обстоятельство делает экземпляры этого класса неизменяемыми: при правильном использовании границы объекта
Range
не должны изменяться после его создания. Однако если не использовать возможности ECMAScript 5 (раздел 9.8.3), свойства
from
и
to
по-прежнему остаются доступными для записи и в действительности объекты
Range
не являются неизменяемыми:

var r = new Range(1,5): // "неизменяемый" диапазон

r.from = function { return 0; }; // Изменчивость имитируется заменой метода

Имейте в виду, что такой прием инкапсуляции имеет отрицательные стороны. Класс, использующий замыкание для инкапсуляции, практически наверняка будет работать медленнее и занимать больше памяти, чем эквивалент с простыми свойствами.

9.6.7. Перегрузка конструкторов и фабричные методы

Иногда бывает необходимо реализовать возможность инициализации объектов несколькими способами. Например, можно было бы предусмотреть возможность инициализации объекта

Complex
значениями радиуса и угла (полярные координаты) вместо вещественной и мнимой составляющих. Или создавать объекты множеств
Set
, членами которых являются элементы массива, а не аргументы конструктора.

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

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Черный рынок

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

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

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

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

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

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

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

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

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

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Путёвка в спецназ

Соколов Вячеслав Иванович
1. Мажор
Фантастика:
боевая фантастика
7.55
рейтинг книги
Путёвка в спецназ

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

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