if (о.hasOwnProperty[prop]) continue; // Кроме имеющихся в о.
о[prop] = р[prop]; // Добавить свойство в о.
}
return о;
}
/*
* Удаляет из объекта о свойства, отсутствующие в объекте р.
* Возвращает о.
*/
function restricts, р) {
fоr(prop in о) { // Для всех свойств в о
if (!(prop in р)) delete о[prop]; // Удалить, если отсутствует в р
}
return о;
}
/*
* Удаляет из объекта о свойства, присутствующие в объекте р. Возвращает о.
*/
function subtracts, р) {
for(prop in р) { // Для всех свойств в р
delete о[ргор]; // Удалить из о (удаление несуществующих
// свойств можно выполнять без опаски)
}
return о;
}
/*
* Возвращает новый объект, содержащий свойства, присутствующие хотя бы в одном
* из объектов, о или р. Если оба объекта, о и р, имеют свойства с одним
* и тем же именем, используется значение свойства из объекта р.
*/
function union(o,p) { return extend(extend({},о), p); }
/*
* Возвращает новый объект, содержащий свойства, присутствующие сразу в обоих
* объектах, о или р. Результат чем-то напоминает пересечение о и р,
* но значения свойств объекта р отбрасываются */
function intersection(o, р) { return restrict(extend({}, о), р); }
/*
* Возвращает массив имен собственных перечислимых свойств объекта о.
*/
function keys(o) {
if (typeof о !== "object”) throw ТуреЕггогО; // Apr. должен быть объектом
var result = []; // Возвращаемый массив
for(var prop in о) { // Для всех перечислимых свойств
if (о.hasOwnProperty(prop)) // Если это собственное свойство,
result.push(prop); // добавить его в массив array.
}
return result; // Вернуть массив.
}
В дополнение к циклу for/in стандарт ECMAScript 5 определяет две функции, перечисляющие имена свойств. Первая из них, Object.keys(), возвращает массив имен собственных перечислимых свойств объекта. Она действует аналогично функции keys() из примера 6.2.
Вторая функция ECMAScript 5, выполняющая перечисление свойств, - Object.getOwnPropertyNames(). Она действует подобно функции Object.keys(), но возвращает имена всех собственных свойств указанного объекта, а не только перечислимые. В реализациях ECMAScript 3 отсутствует возможность реализовать подобные функции, потому что ECMAScript 3 не предусматривает возможность получения неперечислимых свойств объекта.
6.6. Методы чтения и записи свойств
Выше уже говорилось, что свойство объекта имеет имя, значение и набор атрибутов. В ECMAScript 5[10]
значение может замещаться одним или двумя методами, известными как методы чтения (getter) и записи (setter). Свойства, для которых определяются методы чтения и записи, иногда называют свойствами с методами доступа, чтобы отличать их от свойств с данными, представляющих простое значение.
Когда программа пытается получить значение свойства с методами доступа, интерпретатор вызывает метод чтения (без аргументов). Возвращаемое этим методом значение становится значением выражения обращения к свойству. Когда программа пытается записать значение в свойство, интерпретатор вызывает метод записи, передавая ему значение, находящее справа от оператора присваивания. Этот метод отвечает за «установку» значения свойства. Значение, возвращаемое методом записи, игнорируется.
В отличие от свойств с данными, свойства с методами доступа не имеют атрибута writable. Если свойство имеет оба метода, чтения и записи, оно доступно для чтения/записи. Если свойство имеет только метод чтения, оно доступно только для чтения. А если свойство имеет только метод записи, оно доступно только для записи (такое невозможно для свойств с данными) и попытки прочитать значение такого свойства всегда будут возвращать undefined.
10
И в последних версиях реализации стандарта ECMAScript 3 в основных броузерах, кроме IE.