Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
},
{
size: abstractmethod,
fоreach: abstractmethod,
isEmpty: function() { return this.size() == 0; },
toString: function() {
var s = і = 0;
this.foreach(function(v) {
if (i++ > 0) s += ", ";
s += v;
});
return s +
},
toLocaleString : function() {
var s = "{", і = 0;
this.foreach(function(v) {
if (i++ > 0) s += ", "
if (v == null) s += v; // null и undefined
else s += v. toLocaleString(); // все остальные
});
return s +
},
toArray: function() {
var a = [];
this.foreach(function(v) { a.push(v); });
return a;
},
equals: function(that) {
if (!(that instanceof AbstractEnumerableSet)) return false;
// Если множество that имеет другой размер, множества не равны
if (this.size() ! = that.sizeO) return false;
// Проверить наличие каждого элемента this в множестве that,
try {
this.foreach(function(v){
if (!that.contains(v)) throw false;}
);
return true; // Все элементы одинаковые: множества равны.
} catch (х) {
if (х === false) return false; // Множества не равны
throw х; // Повторно возбудить любое иное возникшее исключение.
}
}
});
/*
* SingletonSet - конкретный подкласс класса AbstractEnumerableSet.
* Множество из единственного элемента, доступное только для чтения.
*/
var SingletonSet = AbstractEnumerableSet.extend(
function SingletonSet(member) { this.member = member; },
{
contains: function(x) { return x === this.member; },
size: function() { return 1; },
foreach: function(f,ctx) { f.call(ctx, this.member); }
}
);
/*
* AbstractWritableSet - абстрактный подкласс класса AbstractEnumerableSet.
* Определяет абстрактные методы add() и remove() и реализует конкретные
* методы union(), intersection() и difference().
*/
var AbstractWritableSet = AbstractEnumerableSet.extend(
function() {
throw new Error("Нельзя создать экземпляр абстрактного класса");
},
{
add: abstractmethod,
remove: abstractmethod,
union: function(that) {
var self = this;
that.foreach(function(v) { self.add(v); });
return this;
},
intersection: function(that) {
var self = this;
this.foreach(function(v){
if(!that.contains(v)) self.remove(v);
});
return this;
},
difference: function(that) {
var self = this;
that.foreach(function(v) { self.remove(v); });
return this;
}
});
/*
* ArraySet - конкретный подкласс класса AbstractWritableSet.
* Представляет множество элементов как массив значений и реализует линейный
* поиск в массиве в своем методе contains(). Поскольку алгоритм метода containsO
* имеет сложность 0(п) вместо 0(1), данный класс следует использовать только
* для создания относительно небольших множеств.
* Обратите внимание, что эта реализация опирается на методы класса Array
* indexOfO и forEach(), которые определяются стандартом ES5.
*/
var ArraySet = AbstractWritableSet.extend(
function ArraySet() {
this.values = [];
this.add.apply(this, arguments);
},
{
contains: function(v) {
return this.values.indexOf(v) != -1;
},
size: function() {
return this.values.length;
},
foreach: function(f.c) {
this.values.forEach(f, c);
},
add: function() {
for(var і = 0; і < arguments.length; i++) {
var arg = arguments[i];
if (Ithis.contains(arg)) this.values.push(arg);
}
return this;
},
remove: function() {
for(var і = 0; і < arguments.length; i++) {
var p = this.values.indexOf(arguments[i]);
if (p == -1) continue;
this.values.splice(p, 1);
)
return this;
}
}
);
9.8. Классы в ECMAScript 5
Стандарт ECMAScript 5 добавляет методы, позволяющие определять атрибуты свойств (методы чтения и записи, а также признаки доступности для перечисления, записи и настройки) и ограничивать возможность расширения объектов. Эти методы были описаны в разделах 6.6, 6.7 и 6.8.3 и могут пригодиться при определении классов. В следующих подразделах демонстрируется, как использовать новые возможности ECMAScript 5 для повышения надежности своих классов.
9.8.1. Определение неперечислимых свойств
Класс Set
, представленный в примере 9.6, вынужден использовать уловку, чтобы обеспечить возможность сохранения объектов: он добавляет свойство «object id» ко всем объектам, добавляемым в множество. Если позднее в каком-то другом месте программы будет выполнен обход свойств этого объекта с помощью цикла for/in
, это свойство будет обнаружено. Стандарт ECMAScript 5 позволяет исключить такую возможность, сделав свойство неперечислимым. В примере 9.17 демонстрируется, как это сделать с помощью Object.defineProperty(),
а также показывает, как определить метод чтения и как проверить возможность расширения объекта.
Пример 9.17. Определение неперечислимых свойств
// Обертывание программного код функцией позволяет определять переменные
// в области видимости функции
(function() {
// Определить свойство objectId как неперечислимое и наследуемое
// всеми объектами. При попытке получить значение этого свойства
// вызывается метод чтения. Свойство не имеет метода записи, поэтому
// оно доступно только для чтения. Свойство определяется как ненастраиваемое,
// поэтому его нельзя удалить.
Object.defineProperty(Object.prototype, "objectld", {
get: idGetter, // Метод чтения значения
Интервал:
Закладка: