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

на главную - закладки

Жанры

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

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

Object.get-OwnPropertyDescriptor:

// Вернет {value: 1, writable:true, enumerable:true, configurable:true}

Object.getOwnPropertyDescriptor({x:1}, "x");

// Теперь получим свойство octet объекта random, объявленного выше.

// Вернет { get: /*func*/. set:undefined, enumerable:true, configurable:true}

Object.getOwnPropertyDescriptor(random, "octet");

// Вернет undefined для унаследованных и несуществующих свойств.

Object.getOwnPropertyDescriptor({}, "х"); // undefined, нет такого свойства

Object.getOwnPropertyDescriptor({}, "toString"); // undefined, унаследованное

Как можно заключить из названия метода,

Object.getOwnPropertyDescriptor
работает только с собственными свойствами. Чтобы получить атрибуты унаследованного свойства, необходимо явно выполнить обход цепочки прототипов (смотрите описание
Object.getPrototypeOf
в разделе 6.8.1).

Чтобы изменить значение атрибута свойства или создать новое свойство с заданными значениями атрибутов, следует вызвать метод

Object.defineProperty
, передав ему объект, в котором требуется выполнить изменения, имя создаваемого или изменяемого свойства и объект дескриптора свойства:

var о = {}; // Создать пустой объект без свойств

// Создать неперечислимое простое свойство х со значением 1.

Object.defineProperty(o, "х", { value : 1,

writable: true, enumerable: false, configurable: true}):

// Убедиться, что свойство создано и является неперечислимым

о.х; // => 1

Object.keys(o) // => []

// Теперь сделать свойство х доступным только для чтения

Object.defineProperty(o, "х", { writable: false });

// Попытаться изменить значение свойства

о.х = 2; // Неудача, в строгом режиме возбудит ТуреЕrror

Дескриптор свойства, передаваемый методу

Object.defineProperty,
необязательно должен иметь все четыре атрибута. При создании нового свойства отсутствующие атрибуты получат значение
false
или
undefined
. При изменении существующего свойства для отсутствующих атрибутов будут сохранены текущие значения. Обратите внимание, что этот метод изменяет существующее собственное свойство или создает новое собственное свойство - он не изменяет унаследованные свойства.

Если возникнет необходимость создать или изменить сразу несколько свойств, можно воспользоваться методом

Object.defineProperties.
Первым аргументом ему передается объект, который требуется изменить. Вторым аргументом - объект, отображающий имена создаваемых или модифицируемых свойств в дескрипторы этих свойств. Например:

var р = Object.defineProperties({},{

х:{

value: 1,

writable: true,

enumerable:true,

configurable:true

},

y:{

value: 1,

writable: true,

enumerable:true,

configurable:true },

r:{

get: function { return Math.sqrt(this.x*this.x + this.y*this.y) },

enumerable:true,

configurable:true

}

});

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

Object.defineProperties
возвращает модифицированный объект (подобно методу
Object.defineProperty
).

С методом

Object.сreate,
определяемым стандартом ECMAScript 5, мы познакомились в разделе 6.1, где узнали, что первым аргументом этому методу передается объект, который будет служить прототипом для вновь созданного объекта. Этот метод также принимает второй необязательный аргумент, такой же, как и второй аргумент метода
Object.defineProperties.
Если методу
Object.create
передать множество дескрипторов свойств, они будут использованы для создания свойств нового объекта.

Методы

Object.defineProperty
и
Object.defineProperties
возбуждают исключение
ТуреError
, когда создание или изменение свойств запрещено. Например, при попытке добавить новое свойство в нерасширяемый объект (раздел 6.8.3). Другие причины, по которым эти методы могут возбудить исключение
ТуреЕrror
, имеют непосредственное отношение к атрибутам. Атрибут
writable
контролирует попытки изменить атрибут
value
. А атрибут
configurable
контролирует попытки изменить другие атрибуты (а также определяет возможность удаления свойства). Однако все не так просто. Например, значение свойства, доступного только для чтения, можно изменить, если это свойство доступно для настройки. Кроме того, свойство, доступное только для чтения, можно сделать доступным для записи, даже если это свойство недоступно для настройки. Ниже приводится полный перечень правил. Вызовы
Object.defineProperty
или
Object.defineProperties,
нарушающие их, возбуждают исключение
ТуреЕrror
:

Поделиться:
Популярные книги

Прапорщик. Назад в СССР. Книга 6

Гаусс Максим
6. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 6

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Шатун. Лесной гамбит

Трофимов Ерофей
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Шатун. Лесной гамбит

Ее андалузский друг

Содерберг Александр
1. София Бринкман
Детективы:
прочие детективы
5.00
рейтинг книги
Ее андалузский друг

Иной. Том 3. Родственные связи

Amazerak
3. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Иной. Том 3. Родственные связи

Черный Маг Императора 18

Герда Александр
18. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 18

Я все еще царь. Книга XXXI

Дрейк Сириус
31. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я все еще царь. Книга XXXI

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.00
рейтинг книги
Шайтан Иван 5

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Гримуар темного лорда IV

Грехов Тимофей
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда IV