Чтение онлайн

ЖАНРЫ

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

6.3. Удаление свойств

Оператор

delete
(раздел 4.13.3) удаляет свойство из объекта. Его единственный операнд должен быть выражением обращения к свойству. Может показаться удивительным, но оператор
delete
не оказывает влияния на значение свойства - он оперирует самим свойством:

delete book.author; // Теперь объект book не имеет свойства author,

delete book["main title"]; // Теперь он не имеет свойства "main title".

Оператор

delete
удаляет только собственные свойства и не удаляет унаследованные. (Чтобы удалить унаследованное свойство, необходимо удалять его в объекте-прототипе, в котором оно определено. Такая операция затронет все объекты, наследующие этот прототип.)

Выражение

delete
возвращает значение
true
в случае успешного удаления свойства или когда операция удаления не привела к изменению объекта (например, при попытке удалить несуществующее свойство). Выражение
delete
также возвращает
true
, когда этому оператору передается выражение, не являющееся выражением обращения к свойству:

о = {х:1}; //о имеет собственное свойство х и наследует toString

delete о.х; // Удалит х и вернет true

delete о.х; // Ничего не сделает (х не существует) и вернет true

delete о.toString; // Ничего не сделает (toString не собственное свойство) и вернет true

delete 1; // Бессмысленно, но вернет true

Оператор

delete
не удаляет ненастраиваемые свойства, атрибут
configurable
которых имеет значение
false
. (Однако он может удалять настраиваемые свойства нерасширяемых объектов.) Ненастраиваемыми являются свойства встроенных объектов, а также свойства глобального объекта, созданные с помощью инструкций объявления переменных и функций. Попытка удалить ненастраиваемое свойство в строгом режиме вызывает исключение
Type Error
. В нестрогом режиме (и в реализациях ECMAScript 3) в таких случаях оператор
delete
просто возвращает
false
:

delete Object.prototype; // Удаление невозможно - ненастраиваемое свойство

var х = 1; // Объявление глобальной переменной

delete this.x; // Это свойство нельзя удалить

function f {} // Объявление глобальной функции

delete this.f; // Это свойство также нельзя удалить

При удалении настраиваемых свойств глобального объекта в нестрогом режиме допускается опускать ссылку на глобальный объект и передавать оператору

delete
только имя свойства:

this.x =1; // Создать настраиваемое глобальное свойство (без var)

delete х; // И удалить его

Однако в строгом режиме оператор

delete
возбуждает исключение
SyntaxError
,
если его операндом является неквалифицированный идентификатор, такой как х, поэтому необходимо указывать явное выражение обращения к свойству:

delete х; // В строгом режиме возбудит исключение SyntaxError

delete this.x; // Такой способ работает

6.4. Проверка существования свойств

Объекты в языке JavaScript можно рассматривать как множества свойств, и нередко бывает полезно иметь возможность проверить принадлежность к множеству - проверить наличие в объекте свойства с данным именем. Выполнить такую проверку можно с помощью оператора

in
, с помощью методов
hasOwnProperty
и
propertylsEnumerable
или просто обратившись к свойству.

Оператор

in
требует, чтобы в левом операнде ему было передано имя свойства (в виде строки) и объект в правом операнде. Он возвращает
true
, если объект имеет собственное или унаследованное свойство с этим именем:

var о = { х: 1 }

”х" in о; // true: о имеет собственное свойство "х"

"у" in о; // false: о не имеет свойства "у"

"toString" in о; // true: о наследует свойство toString

Метод

hasOwnProperty
объекта проверяет, имеет ли объект собственное свойство с указанным именем. Для наследуемых свойств он возвращает
false
:

var о = { х: 1 }

о.hasOwnPropertyC'x"); // true: о имеет собственное свойство х

о.hasOwnPropertyC'y"); // false: не имеет свойства у

о.hasOwnProperty("toString"); // false: toString - наследуемое свойство

Метод

propertylsEnumerable
накладывает дополнительные ограничения по сравнению с
hasOwnProperty
. Он возвращает
true
, только если указанное свойство является собственным свойством, атрибут
enumerable
которого имеет значение
true
. Свойства встроенных объектов не являются перечислимыми. Свойства, созданные обычной программой на языке JavaScript, являются перечислимыми, если не был использован один из методов ECMAScript 5, представленных ниже, которые делают свойства неперечислимыми.

var о = inherit({ у: 2 }); о.х = 1;

о.propertyIsEnumerable("x“); // true: о имеет собств. перечислимое свойство х

о.propertyIsEnumerable("у"); // false: у - унаследованное свойство, не собств.

Object.prototype.propertyIsEnumerable("toString”); // false: неперечислимое

var о = { х: 1 }

Поделиться с друзьями: