Выбрать главу

Вторая функция ECMAScript 5, выполняющая перечисление свойств, - Object.getOwnPropertyNames(). Она действует подобно функции Object.keys(), но возвращает имена всех собственных свойств указанного объекта, а не только перечислимые. В реализациях ECMAScript 3 отсутствует возможность реализовать подобные функции, потому что ECMAScript 3 не предусматривает возможность получения неперечислимых свойств объекта.

6.6. Методы чтения и записи свойств

Выше уже говорилось, что свойство объекта имеет имя, значение и набор атрибутов. В ECMAScript 5[10]

значение может замещаться одним или двумя методами, известными как методы чтения (getter) и записи (setter). Свойства, для которых определяются методы чтения и записи, иногда называют свойствами с методами доступа, чтобы отличать их от свойств с данными, представляющих простое значение.

Когда программа пытается получить значение свойства с методами доступа, интерпретатор вызывает метод чтения (без аргументов). Возвращаемое этим методом значение становится значением выражения обращения к свойству. Когда программа пытается записать значение в свойство, интерпретатор вызывает метод записи, передавая ему значение, находящее справа от оператора присваивания. Этот метод отвечает за «установку» значения свойства. Значение, возвращаемое методом записи, игнорируется.

В отличие от свойств с данными, свойства с методами доступа не имеют атрибута writable. Если свойство имеет оба метода, чтения и записи, оно доступно для чтения/записи. Если свойство имеет только метод чтения, оно доступно только для чтения. А если свойство имеет только метод записи, оно доступно только для записи (такое невозможно для свойств с данными) и попытки прочитать значение такого свойства всегда будут возвращать undefined.

Самый простой способ определить свойство с методами доступа заключается в использовании расширенного синтаксиса определения литералов объектов:

var о = {

  // Обычное свойство с данными

  data_prop: value,

  // Свойство с методами доступа определяется как пара функций

  get accessor_prop() { /* тело функции */ },

  set accessor_prop(value) { /* тело функции */ }

};

Свойства с методами доступа определяются как одна или две функции, имена которых совпадают с именем свойства и с заменой ключевого слова function на get и/или set. Обратите внимание, что не требуется использовать двоеточие для отделения имени свойства от функции, управляющей доступом к свойству, но по-прежнему необходимо использовать запятую после тела функции, чтобы отделить метод от других методов или свойств с данными. Для примера рассмотрим следующий объект, представляющий Декартовы координаты точки на плоскости. Для представления координат X и Y в нем имеются обычные свойства с данными, а также свойства с методами доступа, позволяющие получить эквивалентные полярные координаты точки:

var р = {

  // х и у - обычные свойства с данными, доступные для чтения/записи.

  х: 1.0,

  у: 1.0,

  //r - доступное для чтения/записи свойство с двумя методами доступа.

  // Не забывайте добавлять запятые после методов доступа,

  get r() { return Math.sqrt(this.x*this.x + this.y*this.y); },

  set r(newvalue) {

    var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y);

    var ratio = newvalue/oldvalue;

    this.x *= ratio;

    this.у *= ratio;

  }

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

вернуться

10

И в последних версиях реализации стандарта ECMAScript 3 в основных броузерах, кроме IE.