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

<b>  set r(newvalue) {</b>

<b>    var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y); </b>

<b>    var ratio = newvalue/oldvalue; </b>

<b>    this.x *= ratio; </b>

<b>    this.у *= ratio;</b>

<b>  }</b>

<b>  // theta - доступное только для чтения свойство с единственным методом чтения, </b>

<b>  get theta() { return Math.atan2(this.у, this.x); }</b>

<b>};</b>

Обратите внимание на использование ключевого слова

<b>this</b>
в методах чтения и записи выше. Интерпретатор будет вызывать эти функции, как методы объекта, в котором они определены, т.е. в теле функции
<b>this</b>
будет ссылаться на объект точки. Благодаря этому метод чтения свойства r может ссылаться на свойства x и у, как
<b>this.x</b>
и
<b>this.у</b>
. Подробнее о методах и ключевом слове
<b>this</b>
рассказывается в разделе 8.2.2.

Свойства с методами доступа наследуются так же, как обычные свойства с данными, поэтому объект

<b>р</b>
, определенный выше, можно использовать как прототип для других объектов точек. В новых объектах можно определять собственные свойства х и у, и они будут наследовать свойства 
<b>r</b>
и
<b>theta</b>
:

<b>var q = inherit(p);   // Создать новый объект, наследующий методы доступа</b>

<b>q.x = 1; q.y = 1;     // Создать собственные свойства с данными в объекте q</b>

<b>console.log(q.r);     // И использовать унаследованные свойства</b>

<b>console.log(q.theta); // с методами доступа</b>

Фрагмент выше использует свойства с методами доступа для определения API, обеспечивающего представление единого набора данных в двух системах координат (Декартовой и полярной). Еще одной причиной использования свойств с методами доступа может быть необходимость проверки значения перед записью и возврат разных значений при каждом чтении свойства:

<b>// Этот объект генерирует последовательность увеличивающихся чисел </b>

<b>var serialnum = {</b>

<b>  // Это свойство с данными хранит следующее число в последовательности.</b>

<b>  // Знак $ в имени свойства говорит о том, что оно является частным.</b>

<b>  $n: 0,</b>

<b>  // Возвращает текущее значение и увеличивает его </b>

<b>  get next() { return this.$n++; },</b>

<b>  // Устанавливает новое значение n, но только если оно больше текущего </b>

<b>  set next(n) {</b>

<b>    if (n &gt;= this.Sn) this.$n = n;</b>

<b>    else throw &quot;число может быть только увеличено &quot;;</b>

<b>  }</b>

<b>};</b>

Наконец, ниже приводится еще один пример использования метода чтения для реализации свойства с «таинственным» поведением.

<b>// Этот объект имеет свойства с методами доступа, при обращении к которым возвращаются</b>

<b>// случайные числа. Например, каждый раз при вычислении выражения ”random.octet&quot;</b>

<b>// будет возвращаться случайное число в диапазоне от 0 до 255. </b>

<b>var random = {</b>

<b>  get octet() { return Math.floor(Math.random()*256); }, </b>

<b>  get uint16() { return Math.floor(Math.random()*65536); }, </b>

<b>  get int16() { return Math.floor(Math.random()*65536)-32768; }</b>

<b>};</b>

В этом разделе было показано, как определять свойства с методами доступа при создании нового объекта с помощью литерала. В следующем разделе будет показано, как добавлять свойства с методами доступа в существующие объекты.

6.7. Атрибуты свойств

Помимо имени и значения свойства обладают атрибутами, определяющими их доступность для записи, перечисления и настройки. В ECMAScript 3 не предусматривается возможность изменения атрибутов: все свойства, создаваемые программами, выполняющимися под управлением реализации ECMAScript 3, доступны для записи, перечисления и настройки, и нет никакой возможности изменить эти атрибуты. Данный раздел описывает прикладной интерфейс (API), определяемый стандартом ECMAScript 5 для получения и изменения атрибутов свойств. Данный API имеет особое значение для разработчиков библиотек, потому что он позволяет:

• добавлять методы в объекты-прототипы и делать их неперечислимыми, подобно встроенным методам;

• «ограничивать» возможности объектов за счет определения свойств, которые не могут изменяться или удаляться.

Для целей данного раздела мы будем рассматривать методы чтения и записи свойств с методами как атрибуты свойств. Следуя этой логике, можно даже сказать, что значение свойства с данными также является атрибутом. Таким образом, свойства имеют имя и четыре атрибута. Четырьмя атрибутами свойств с данными являются: значение (

<b>value</b>
), признак доступности для записи (
<b>writable</b>
), признак доступности для перечисления (
<b>enumerable</b>
) и признак доступности для настройки (
<b>configurable</b>
). В свойствах с методами доступа отсутствуют атрибуты
<b>value</b>
и
<b>writable</b>
: их доступность для записи определяется наличием или отсутствием метода записи. Поэтому четырьмя атрибутами свойств с методами доступа являются: метод чтения (
<b>get</b>
), метод записи (
<b>set</b>
), признак доступности для перечисления (
<b>enumerable</b>
) и признак доступности для настройки (
<b>configurable</b>
).