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

<b>// Создать нерасширяемый объект с ненастраиваемыми свойствами, с жестко </b>

<b>// зафиксированным прототипом и свойством, недоступным для перечисления </b>

<b>var о = Object.seal(Object.create(Object.freeze({x:1}),</b>

<b>                 {у: {value: 2, writable: true}})):</b>

6.9. Сериализация объектов

Сериализация объектов - это процесс преобразования объектов в строковую форму представления, которая позднее может использоваться для их восстановления. Для сериализации и восстановления объектов JavaScript стандартом ЕСМА-Script 5 предоставляются встроенные функции

<b>JSON.stringify()</b>
и
<b>JSON.parse()</b>
. Эти функции используют формат обмена данными JSON. Название JSON происходит от «JavaScript Object Notation» (форма записи объектов JavaScript), а синтаксис этой формы записи напоминает синтаксис литералов объектов и массивов в языке JavaScript:

<b>о = {х:1, у:{z:[false.null,&quot;&quot;]}}: // Определить испытательный объект </b>

<b>s = JSON.stringify(o); // s == '{&quot;х&quot;:1,&quot;у&quot;:{&quot;z&quot;:[false,null,'&quot;]}}'</b>

<b>p = JSON.parse(s); // P - глубокая копия объекта о</b>

Базовые реализации этих функций в ECMAScript 5 очень точно повторяют общедоступные реализации в ECMAScript 3, доступные в http://json.org/json2.js. С практической точки зрения это совершенно одинаковые реализации, и эти функции стандарта ECMAScript 5 можно использовать в ECMAScript 3, подключив указанный выше модуль json2.js.

Синтаксис формата JSON является лишь подмножеством синтаксиса языка JavaScript и не может использоваться для представления всех возможных значений, допустимых в JavaScript. Поддерживаются и могут быть сериализованы и восстановлены: объекты, массивы, строки, конечные числовые значения,

<b>true</b>
,
<b>false</b>
и
<b>null</b>
. Значения
<b>NaN, Infinity</b>
и
<b>-Infinity</b>
сериализуются в значение
<b>null</b>
. Объекты
<b>Date</b>
сериализуются в строки с датами в формате ISO (смотрите описание функции
<b>Date.toJSON()</b>
), но
<b>JSON.parse()</b>
оставляет их в строковом представлении и не восстанавливает первоначальные объекты
<b>Date</b>
. Объекты
<b>Function, RegExp</b>
и
<b>Error</b>
и значение
<b>undefined</b>
не могут быть сериализованы или восстановлены. Функция
<b>JSON.stringify()</b>
сериализует только перечислимые собственные свойства объекта. Если значение свойства не может быть сериализовано, это свойство просто исключается из строкового представления. Обе функции,
<b>JSON.stringify()</b>
и
<b>JSON.parse()</b>
, принимают необязательный второй аргумент, который можно использовать для настройки процесса сериализации и/или восстановления, например, посредством определения списка свойств, подлежащих сериализации, или функции преобразования значений во время сериализации. В справочном разделе приводится полное описание этих функций.

6.10. Методы класса Object

Как описывалось выше, все объекты в языке JavaScript (за исключением тех, что явно созданы без прототипа) наследуют свойства от Object.prototype. Эти наследуемые свойства являются первичными методами и представляют особый интерес для программистов на JavaScript, потому что доступны повсеместно. Мы уже познакомились с методами

<b>hasOwnProperty()</b>
,
<b>propertylsEnumerable()</b>
и
<b>isPrototy-peOf()</b>
. (И мы уже охватили достаточно много статических функций, определяемых конструктором
<b>Object</b>
, таких как
<b>Object.create()</b>
и
<b>Object.getPrototypeOf()</b>
.) В этом разделе описывается несколько универсальных методов объектов, которые определены в
<b>Object.prototype</b>
и предназначены для переопределения в других, более специализированных классах.

6.10.1. Метод toString()

Метод toString() не требует аргументов; он возвращает строку, каким-либо образом представляющую значение объекта, для которого он вызывается. Интерпретатор JavaScript вызывает этот метод объекта во всех тех случаях, когда ему требуется преобразовать объект в строку. Например, это происходит, когда используется оператор

<b>+</b>
для конкатенации строки с объектом, или при передаче объекта методу, требующему строку.

Метод

<b>toString()</b>
по умолчанию не очень информативен (однако его удобно использовать для определения класса объекта, как было показано в разделе 6.8.2). Например, следующий фрагмент просто записывает в переменную s строку "[object Object]":

<b>var s = { x:1, у:1 }.toString( );</b>

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

<b>toString().</b>
Например, когда массив преобразуется в строку, мы получаем список элементов массива, каждый из которых преобразуется в строку, а когда в строку преобразуется функция, мы получаем исходный программный код этой функции. Эти специализированные версии метода
<b>toString()</b>
описываются в справочном руководстве. Смотрите, например, описание методов
<b>Array.toString(), Date.toString()</b>
и
<b>Function.toString()</b>
.

В разделе 9.6.3 описывается, как можно переопределить метод

<b>toString()</b>
для своих собственных классов.

6.10.2. Метод toLocaleString()

В дополнение к методу

<b>toString()</b>
все объекты имеют метод
<b>toLocaleString().</b>
Назначение последнего состоит в получении локализованного строкового представления объекта. По умолчанию метод
<b>toLocaleString()</b>
, определяемый классом
<b>Object</b>
, никакой локализации не выполняет; он просто вызывает метод
<b>toString()</b>
и возвращает полученное от него значение. Классы
<b>Date</b>
и
<b>Number</b>
определяют собственные версии метода
<b>toLocaleString()</b>
, возвращающие строковые представления чисел и дат в соответствии с региональными настройками. Класс
<b>Array</b>
определяет версию метода
<b>toLocaleString()</b>
, действующую подобно методу
<b>toString()</b>
за исключением того, что он форматирует элементы массива вызовом их метода
<b>toLocaleString()</b>
, а не
<b>toString()</b>
.