Шрифт:
Другой интересной особенностью этого примера является передача значения null функции
Object.сreate
при создании объекта, не наследующего ничего. Этот объект используется для хранения элементов множества, а тот факт, что он не имеет прототипа, позволяет вместо метода hasOwnProperty
использовать оператор in
. Пример 9.22.
StringSet
: определение подкласса множества с использованием ECMAScript 5
function StringSet {
this.set = Object.create(null); // Создать объект без прототипа
this.n = 0;
this.add.apply(this, arguments);
}
// Обратите внимание, что Object.create позволяет обеспечить наследование
// прототипа суперкласса и определить методы за счет единственного вызова.
// Поскольку при создании свойств мы не указываем значения атрибутов writable,
// enumerable и configurable, они по умолчанию получают значение false.
// Доступность методов только для чтения усложняет их переопределение в подклассах.
StringSet.prototype = Object.create(AbstractWritableSet.prototype, {
constructor: { value: StringSet },
contains: { value: function(x) { return x in this.set; } }.
size: { value: function(x) { return this.n; } },
foreach: { value: function(f,c) { Object.keys(this.set).forEach(f.c); } }.
add: {
value: function {
for(var і = 0; і < arguments.length; i++) {
if (!(arguments[i] in this.set)) {
this.set[arguments[i]] = true;
this.n++;
}
}
return this;
}
),
remove: {
value: function {
for(var і = 0; і < arguments.length; i++){
if (arguments[i] in this.set) {
delete this.set[arguments[i]];
this, n--;
}
}
return this;
}
}
});
9.8.6. Дескрипторы свойств
В разделе 6.7 дается описание дескрипторов свойств, введенных стандартом ECMAScript 5, но там отсутствуют примеры, демонстрирующие различные случаи их использования. Мы завершим этот раздел, посвященный особенностям ECMAScript 5, расширенным примером, демонстрирующим многие операции со свойствами, допустимые в ECMAScript 5. Программный код в примере 9.23 добавляет в
Object.prototype
метод properties
(разумеется, недоступный для перечисления). Значение, возвращаемое этим методом, является объектом, представляющим список свойств и обладающим полезными методами для отображения свойств и атрибутов (которые могут пригодиться при отладке). Его можно использовать для получения дескрипторов свойств (на случай, если потребуется реализовать копирование свойств вместе с их атрибутами) и для установки атрибутов свойств (благодаря чему он может использоваться как альтернатива функциям hideProps
и freezeProps,
объявленным ранее). Этот единственный пример демонстрирует большинство особенностей свойств в ECMAScript 5, а также применение методики модульного программирования, о которой будет рассказываться в следующем разделе. Пример 9.23. Особенности свойств в ECMAScript 5
/*
* Определяет метод properties в Object.prototype, возвращающий объект, который
* представляет указанные свойства объекта, относительно которого был вызван метод
* (или все собственные свойства объекта, если метод был вызван без аргументов).