get theta() { return Math.atan2(this.у, this.x); }
};
Обратите внимание на использование ключевого слова this в методах чтения и записи выше. Интерпретатор будет вызывать эти функции, как методы объекта, в котором они определены, т.е. в теле функции this будет ссылаться на объект точки. Благодаря этому метод чтения свойства r может ссылаться на свойства x и у, как this.x и this.у. Подробнее о методах и ключевом слове this рассказывается в разделе 8.2.2.
Свойства с методами доступа наследуются так же, как обычные свойства с данными, поэтому объект р, определенный выше, можно использовать как прототип для других объектов точек. В новых объектах можно определять собственные свойства х и у, и они будут наследовать свойства 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 имеет особое значение для разработчиков библиотек, потому что он позволяет: