JavaScript. Подробное руководство, 6-е издание
<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>. Эти функции используют формат обмена данными JSON. Название JSON происходит от «JavaScript Object Notation» (форма записи объектов JavaScript), а синтаксис этой формы записи напоминает синтаксис литералов объектов и массивов в языке JavaScript:<b>JSON.parse()</b><b>о = {х:1, у:{z:[false.null,""]}}: // Определить испытательный объект </b><b>s = JSON.stringify(o); // s == '{"х":1,"у":{"z":[false,null,'"]}}'</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>сериализуются в строки с датами в формате ISO (смотрите описание функции<b>Date</b>), но<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>Метод
по умолчанию не очень информативен (однако его удобно использовать для определения класса объекта, как было показано в разделе 6.8.2). Например, следующий фрагмент просто записывает в переменную s строку "[object Object]":<b>toString()</b><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>