Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Свойства с методами доступа наследуются так же, как обычные свойства с данными, поэтому объект р
, определенный выше, можно использовать как прототип для других объектов точек. В новых объектах можно определять собственные свойства х и у, и они будут наследовать свойства r
и theta
:
var q = inherit(p); // Создать новый объект, наследующий методы доступа
q.x = 1; q.y = 1; // Создать собственные свойства с данными в объекте q
console.log(q.r); // И использовать унаследованные свойства
console.log(q.theta); // с методами доступа
Фрагмент выше использует свойства с методами доступа для определения API, обеспечивающего представление единого набора данных в двух системах координат (Декартовой и полярной). Еще одной причиной использования свойств с методами доступа может быть необходимость проверки значения перед записью и возврат разных значений при каждом чтении свойства:
// Этот объект генерирует последовательность увеличивающихся чисел
var serialnum = {
// Это свойство с данными хранит следующее число в последовательности.
// Знак $ в имени свойства говорит о том, что оно является частным.
$n: 0,
// Возвращает текущее значение и увеличивает его
get next() { return this.$n++; },
// Устанавливает новое значение n, но только если оно больше текущего
set next(n) {
if (n >= this.Sn) this.$n = n;
else throw "число может быть только увеличено ";
}
};
Наконец, ниже приводится еще один пример использования метода чтения для реализации свойства с «таинственным» поведением.
// Этот объект имеет свойства с методами доступа, при обращении к которым возвращаются
// случайные числа. Например, каждый раз при вычислении выражения ”random.octet"
// будет возвращаться случайное число в диапазоне от 0 до 255.
var random = {
get octet() { return Math.floor(Math.random()*256); },
get uint16() { return Math.floor(Math.random()*65536); },
get int16() { return Math.floor(Math.random()*65536)-32768; }
};
В этом разделе было показано, как определять свойства с методами доступа при создании нового объекта с помощью литерала. В следующем разделе будет показано, как добавлять свойства с методами доступа в существующие объекты.
6.7. Атрибуты свойств
Помимо имени и значения свойства обладают атрибутами, определяющими их доступность для записи, перечисления и настройки. В ECMAScript 3 не предусматривается возможность изменения атрибутов: все свойства, создаваемые программами, выполняющимися под управлением реализации ECMAScript 3, доступны для записи, перечисления и настройки, и нет никакой возможности изменить эти атрибуты. Данный раздел описывает прикладной интерфейс (API), определяемый стандартом ECMAScript 5 для получения и изменения атрибутов свойств. Данный API имеет особое значение для разработчиков библиотек, потому что он позволяет:
• добавлять методы в объекты-прототипы и делать их неперечислимыми, подобно встроенным методам;
• «ограничивать» возможности объектов за счет определения свойств, которые не могут изменяться или удаляться.
Для целей данного раздела мы будем рассматривать методы чтения и записи свойств с методами как атрибуты свойств. Следуя этой логике, можно даже сказать, что значение свойства с данными также является атрибутом. Таким образом, свойства имеют имя и четыре атрибута. Четырьмя атрибутами свойств с данными являются: значение ( value
), признак доступности для записи ( writable
), признак доступности для перечисления ( enumerable
) и признак доступности для настройки ( configurable
). В свойствах с методами доступа отсутствуют атрибуты value
и writable
: их доступность для записи определяется наличием или отсутствием метода записи. Поэтому четырьмя атрибутами свойств с методами доступа являются: метод чтения ( get
), метод записи ( set
), признак доступности для перечисления ( enumerable
) и признак доступности для настройки ( configurable
).
Методы получения и записи значений атрибутов свойств, предусмотренные стандартом ECMAScript 5, используют объект, называемый дескриптором свойства ( property descriptor
), представляющий множество из четырех атрибутов. Объект дескриптора свойства обладает свойствами, имена которых совпадают с именами атрибутов свойства, которое он описывает. То есть объекты-дескрипторы свойств с данными имеют свойства с именами value
, writable
, enumerable
и configurable
. А дескрипторы свойств с методами доступа вместо свойств value
и writable
имеют свойства get
и set
. Свойства writable
, enumerable
и configurable
являются логическими значениями, а свойства get
и set
- функциями.
Получить дескриптор свойства требуемого объекта можно вызовом Object.get-OwnPropertyDescriptor():
// Вернет {value: 1, writable:true, enumerable:true, configurable:true}
Object.getOwnPropertyDescriptor({x:1}, "x");
// Теперь получим свойство octet объекта random, объявленного выше.
// Вернет { get: /*func*/. set:undefined, enumerable:true, configurable:true}
Object.getOwnPropertyDescriptor(random, "octet");
// Вернет undefined для унаследованных и несуществующих свойств.
Object.getOwnPropertyDescriptor({}, "х"); // undefined, нет такого свойства
Object.getOwnPropertyDescriptor({}, "toString"); // undefined, унаследованное
Как можно заключить из названия метода, Object.getOwnPropertyDescriptor()
работает только с собственными свойствами. Чтобы получить атрибуты унаследованного свойства, необходимо явно выполнить обход цепочки прототипов (смотрите описание Object.getPrototypeOf()
в разделе 6.8.1).
Чтобы изменить значение атрибута свойства или создать новое свойство с заданными значениями атрибутов, следует вызвать метод Object.defineProperty()
, передав ему объект, в котором требуется выполнить изменения, имя создаваемого или изменяемого свойства и объект дескриптора свойства:
var о = {}; // Создать пустой объект без свойств
// Создать неперечислимое простое свойство х со значением 1.
Object.defineProperty(o, "х", { value : 1,
writable: true, enumerable: false, configurable: true}):
Интервал:
Закладка: