Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
}
Этой функции classof() можно передать любое значение, допустимое в языке JavaScript. Числа, строки и логические значения действуют подобно объектам, когда относительно них вызывается метод toString()
, а значения null
и undefined
обрабатываются особо. (В ECMAScript 5 особая обработка не требуется.) Объекты, созданные с помощью встроенных конструкторов, таких как Array
и Date
, имеют атрибут class
, значение которого совпадает с именами их конструкторов. Объекты среды выполнения обычно также получают осмысленное значение атрибута class
, однако это зависит от реализации. Объекты, созданные с помощью литералов или вызовом Object.сreate
, получают атрибут class
со значением «Object». Если вы определите свой конструктор, все объекты, созданные с его помощью, получат атрибут class
со значением «Object»: нет никакого способа установить иное значение в атрибуте class
для собственных классов объектов:
classof(null) // => "Null"
classof(1) // => "Number"
classof("") // => "String"
classof(false) // => "Boolean"
classof({}) // => "Object"
classof([]) // => "Array"
classof(/./) // => "Regexp"
classof(new DateO) // => "Date"
classof(window) // => "Window" (объект клиентской среды выполнения)
function f() {}; // Определение собственного конструктора
classof(new f()); // => "Object"
6.8.3. Атрибут extensible
Атрибут extensible
объекта определяет, допускается ли добавлять в объект новые свойства. В ECMAScript 3 все встроенные и определяемые пользователем объекты неявно допускали возможность расширения, а расширяемость объектов среды выполнения определялась каждой конкретной реализацией. В ECMAScript 5 все встроенные и определяемые пользователем объекты являются расширяемыми, если они не были преобразованы в нерасширяемые объекты, а расширяемость объектов среды выполнения по-прежнему определяется каждой конкретной реализацией.
Стандарт ECMAScript 5 определяет функции для получения и изменения признака расширяемости объекта. Чтобы определить, допускается ли расширять объект, его следует передать методу Object.isExtensible().
Чтобы сделать объект нерасширяемым, его нужно передать методу Object.preventExtensions()
. Обратите внимание, что после того как объект будет сделан нерасширяемым, его нельзя снова сделать расширяемым. Отметьте также, что вызов preventExtensions()
оказывает влияние только на расширяемость самого объекта. Если новые свойства добавить в прототип нерасширяемого объекта, нерасширяемый объект унаследует эти новые свойства.
Назначение атрибута extensible
заключается в том, чтобы дать возможность «фиксировать» объекты в определенном состоянии, запретив внесение изменений. Атрибут объектов extensible
часто используется совместно с атрибутами свойств configurable
и writable
, поэтому в ECMAScript 5 определяются функции, упрощающие одновременную установку этих атрибутов.
Метод Object.seal()
действует подобно методу Object.preventExtensions()
, но он не только делает объект нерасширяемым, но и делает все свойства этого объекта недоступными для настройки. То есть в объект нельзя будет добавить новые свойства, а существующие свойства нельзя будет удалить или настроить. Однако существующие свойства, доступные для записи, по-прежнему могут быть изменены.
После вызова Object.seal()
объект нельзя будет вернуть в прежнее состояние. Чтобы определить, вызывался ли метод Object.seal()
для объекта, можно вызвать метод Object.isSealed().
Метод Object.freeze()
обеспечивает еще более жесткую фиксацию объектов. Помимо того, что он делает объект нерасширяемым, а его свойства недоступными для настройки, он также делает все собственные свойства с данными доступными только для чтения. (Это не относится к свойствам объекта с методами доступа, обладающими методами записи; эти методы по-прежнему будут вызываться инструкциями присваивания.) Чтобы определить, вызывался ли метод Object.freeze()
объекта, можно вызвать метод Object.isFrozen()
.
Важно понимать, что Object.seal()
и Object.freeze()
воздействуют только на объект, который им передается: они не затрагивают прототип этого объекта. Если в программе потребуется полностью зафиксировать объект, вам, вероятно, потребуется зафиксировать также объекты в цепочке прототипов.
Все методы, Object.preventExtensions()
, Object.seal()
и Object.freeze()
, возвращают переданный им объект, а это означает, что их можно использовать во вложенных вызовах:
// Создать нерасширяемый объект с ненастраиваемыми свойствами, с жестко
// зафиксированным прототипом и свойством, недоступным для перечисления
var о = Object.seal(Object.create(Object.freeze({x:1}),
{у: {value: 2, writable: true}})):
6.9. Сериализация объектов
Сериализация объектов - это процесс преобразования объектов в строковую форму представления, которая позднее может использоваться для их восстановления. Для сериализации и восстановления объектов JavaScript стандартом ЕСМА-Script 5 предоставляются встроенные функции JSON.stringify()
и JSON.parse()
. Эти функции используют формат обмена данными JSON. Название JSON происходит от «JavaScript Object Notation» (форма записи объектов JavaScript), а синтаксис этой формы записи напоминает синтаксис литералов объектов и массивов в языке JavaScript:
о = {х:1, у:{z:[false.null,""]}}: // Определить испытательный объект
s = JSON.stringify(o); // s == '{"х":1,"у":{"z":[false,null,'"]}}'
p = JSON.parse(s); // P - глубокая копия объекта о
Базовые реализации этих функций в ECMAScript 5 очень точно повторяют общедоступные реализации в ECMAScript 3, доступные в http://json.org/json2.js. С практической точки зрения это совершенно одинаковые реализации, и эти функции стандарта ECMAScript 5 можно использовать в ECMAScript 3, подключив указанный выше модуль json2.js.
Синтаксис формата JSON является лишь подмножеством синтаксиса языка JavaScript и не может использоваться для представления всех возможных значений, допустимых в JavaScript. Поддерживаются и могут быть сериализованы и восстановлены: объекты, массивы, строки, конечные числовые значения, true
, false
и null
. Значения NaN, Infinity
и -Infinity
сериализуются в значение null
. Объекты Date
сериализуются в строки с датами в формате ISO (смотрите описание функции Date.toJSON()
), но JSON.parse()
оставляет их в строковом представлении и не восстанавливает первоначальные объекты Date
. Объекты Function, RegExp
и Error
и значение undefined
не могут быть сериализованы или восстановлены. Функция JSON.stringify()
сериализует только перечислимые собственные свойства объекта. Если значение свойства не может быть сериализовано, это свойство просто исключается из строкового представления. Обе функции, JSON.stringify()
и JSON.parse()
, принимают необязательный второй аргумент, который можно использовать для настройки процесса сериализации и/или восстановления, например, посредством определения списка свойств, подлежащих сериализации, или функции преобразования значений во время сериализации. В справочном разделе приводится полное описание этих функций.
Интервал:
Закладка: