JavaScript. Подробное руководство, 6-е издание
<b> return о;</b><b>}</b><b>/*</b><b>* Возвращает новый объект, содержащий свойства, присутствующие хотя бы в одном</b><b>* из объектов, о или р. Если оба объекта, о и р, имеют свойства с одним</b><b>* и тем же именем, используется значение свойства из объекта р.</b><b>*/</b><b>function union(o,p) { return extend(extend({},о), p); }</b><b>/*</b><b>* Возвращает новый объект, содержащий свойства, присутствующие сразу в обоих</b><b>* объектах, о или р. Результат чем-то напоминает пересечение о и р,</b><b>* но значения свойств объекта р отбрасываются */</b><b>function intersection(o, р) { return restrict(extend({}, о), р); }</b><b>/*</b><b>* Возвращает массив имен собственных перечислимых свойств объекта о.</b><b>*/</b><b>function keys(o) {</b><b> if (typeof о !== "object”) throw ТуреЕггогО; // Apr. должен быть объектом </b><b> var result = []; // Возвращаемый массив</b><b> for(var prop in о) { // Для всех перечислимых свойств</b><b> if (о.hasOwnProperty(prop)) // Если это собственное свойство,</b><b> result.push(prop); // добавить его в массив array.</b><b> }</b><b> return result; // Вернуть массив.</b><b>}</b>В дополнение к циклу
стандарт ECMAScript 5 определяет две функции, перечисляющие имена свойств. Первая из них,<b>for/in</b>возвращает массив имен собственных перечислимых свойств объекта. Она действует аналогично функции<b>Object.keys(),</b>из примера 6.2.<b>keys()</b>Вторая функция ECMAScript 5, выполняющая перечисление свойств, -
Она действует подобно функции<b>Object.getOwnPropertyNames().</b>но возвращает имена всех собственных свойств указанного объекта, а не только перечислимые. В реализациях ECMAScript 3 отсутствует возможность реализовать подобные функции, потому что ECMAScript 3 не предусматривает возможность получения неперечислимых свойств объекта.<b>Object.keys(),</b>6.6. Методы чтения и записи свойств
Выше уже говорилось, что свойство объекта имеет имя, значение и набор атрибутов. В ECMAScript 5 [10]
значение может замещаться одним или двумя методами, известными как методы чтения (
) и записи (<b>getter</b>). Свойства, для которых определяются методы чтения и записи, иногда называют свойствами с методами доступа, чтобы отличать их от свойств с данными, представляющих простое значение.<b>setter</b>Когда программа пытается получить значение свойства с методами доступа, интерпретатор вызывает метод чтения (без аргументов). Возвращаемое этим методом значение становится значением выражения обращения к свойству. Когда программа пытается записать значение в свойство, интерпретатор вызывает метод записи, передавая ему значение, находящее справа от оператора присваивания. Этот метод отвечает за «установку» значения свойства. Значение, возвращаемое методом записи, игнорируется.
В отличие от свойств с данными, свойства с методами доступа не имеют атрибута
. Если свойство имеет оба метода, чтения и записи, оно доступно для чтения/записи. Если свойство имеет только метод чтения, оно доступно только для чтения. А если свойство имеет только метод записи, оно доступно только для записи (такое невозможно для свойств с данными) и попытки прочитать значение такого свойства всегда будут возвращать<b>writable</b>.<b>undefined</b>Самый простой способ определить свойство с методами доступа заключается в использовании расширенного синтаксиса определения литералов объектов:
<b>var о = {</b><b> // Обычное свойство с данными </b><b> data_prop: value,</b><b> // Свойство с методами доступа определяется как пара функций </b><b> get accessor_prop() { /* тело функции */ }, </b><b> set accessor_prop(value) { /* тело функции */ }</b><b>};</b>Свойства с методами доступа определяются как одна или две функции, имена которых совпадают с именем свойства и с заменой ключевого слова
на<b>function</b>t и/или<b>ge</b>. Обратите внимание, что не требуется использовать двоеточие для отделения имени свойства от функции, управляющей доступом к свойству, но по-прежнему необходимо использовать запятую после тела функции, чтобы отделить метод от других методов или свойств с данными. Для примера рассмотрим следующий объект, представляющий Декартовы координаты точки на плоскости. Для представления координат X и Y в нем имеются обычные свойства с данными, а также свойства с методами доступа, позволяющие получить эквивалентные полярные координаты точки:<b>set</b><b>var р = {</b><b> // х и у - обычные свойства с данными, доступные для чтения/записи. </b><b> х: 1.0,</b><b> у: 1.0,</b><b> //r - доступное для чтения/записи свойство с двумя методами доступа. </b><b> // Не забывайте добавлять запятые после методов доступа, </b><b> get r() { return Math.sqrt(this.x*this.x + this.y*this.y); }, </b>