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

Пользовательский объект - любой объект, созданный в результате выполнения программного кода JavaScript.

Собственное свойство - это свойство, определяемое непосредственно в данном объекте.

Унаследованное свойство - это свойство, определяемое прототипом объекта."

6.1. Создание объектов

Объекты можно создавать с помощью литералов объектов, ключевого слова new и (в ECMAScript 5) функции Object.create(). Все эти приемы описываются в следующих разделах.

6.1.1. Литералы объектов

Самый простой способ создать объект заключается во включении в программу литерала объекта. Литерал объекта - это заключенный в фигурные скобки список свойств (пар имя/значение), разделенных запятыми. Именем свойства может быть идентификатор или строковый литерал (допускается использовать пустую строку). Значением свойства может быть любое выражение, допустимое в JavaScript, - значение выражения (это может быть простое значение или объект) станет значением свойства. Ниже приводится несколько примеров создания объектов:

<b>var empty = {};                         </b>
<b>// Объект без свойств</b>

<b>var point = { x:0, y:0 };               // Два свойства</b>

<b>var point2 = { x:point.x, y:point.y+1 };// Более сложные значения</b>

<b>var book = {</b>

<b>&quot;main title&quot;: &quot;JavaScript&quot;,             // Имена свойств с пробелами</b>

<b>'sub-title': &quot;The Definitive Guide&quot;,    // и дефисами, поэтому используются</b>

<b>                                        // строковые литералы </b>

<b>&quot;for&quot;: &quot;all audiences&quot;,                 // for - зарезервированное слово,</b>

<b>                                        // поэтому в кавычках </b>

<b>author: {                               // Значением этого свойства является</b>

<b>firstname: &quot;David”,                     // объект. Обратите внимание, что </b>

<b>surname: &quot;Flanagan&quot;                     // имена этих свойств без кавычек.</b>

<b>  }</b>

<b>}</b>

В ECMAScript 5 (и в некоторых реализациях ECMAScript 3) допускается использовать зарезервированные слова в качестве имен свойств без кавычек. Однако в целом имена свойств, совпадающие с зарезервированными словами, в ECMAScript 3 должны заключаться в кавычки. В ECMAScript 5 последняя запятая, следующая за последним свойством в литерале объекта, игнорируется. В большинстве реализаций ECMAScript 3 завершающие запятые также игнорируются, но IE интерпретирует их наличие как ошибку.

Литерал объекта - это выражение, которое создает и инициализирует новый объект всякий раз, когда производится вычисление этого выражения. Значение каждого свойства вычисляется заново, когда вычисляется значение литерала. Это означает, что с помощью единственного литерала объекта можно создать множество новых объектов, если этот литерал поместить в тело цикла или функции, которая будет вызываться многократно, и что значения свойств этих объектов могут отличаться друг от друга.

6.1.2. Создание объектов с помощью оператора new

Оператор new создает и инициализирует новый объект. За этим оператором должно следовать имя функции. Функция, используемая таким способом, называется конструктором и служит для инициализации вновь созданного объекта. Базовый JavaScript включает множество встроенных конструкторов для создания объектов базового языка. Например:

<b>var о = new Object(); // Создать новый пустой объект: то же, что и {}.</b>

<b>var а = new Аггау();  // Создать пустой массив: то же, что и [].</b>

<b>var d = new Date();  // Создать объект Date, представляющий текущее время</b>

<b>var г = new RegExp(&quot;js&quot;); // Создать объект RegExp для операций</b>

<b>                          // сопоставления с шаблоном.</b>

Помимо этих встроенных конструкторов имеется возможность определять свои собственные функции-конструкторы для инициализации вновь создаваемых объектов. О том, как это делается, рассказывается в главе 9.

6.1.3. Прототипы

Прежде чем перейти к третьему способу создания объектов, необходимо сделать паузу, чтобы познакомиться с прототипами. Каждый объект в языке JavaScript имеет второй объект (или

<b>null</b>
, но значительно реже), ассоциированный с ним. Этот второй объект называется прототипом, и первый объект наследует от прототипа его свойства.

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

<b>Object.prototype</b>
. Объекты, созданные с помощью ключевого слова
<b>new</b>
и вызова конструктора, в качестве прототипа получают значение свойства
<b>prototype</b>
функции-конструктора. Поэтому объект, созданный выражением
<b>new Object()</b>
, наследует свойства объекта
<b>Object.prototype</b>
, как если бы он был создан с помощью литерала в фигурных скобках
<b>{}</b>
. Аналогично прототипом объекта, созданного выражением
<b>new Array(),</b>
является
<b>Array.prototype</b>
, а прототипом объекта, созданного выражением
<b>new Date(),</b>
является
<b>Date.prototype</b>
.

<b>Object.prototype</b>
- один из немногих объектов, которые не имеют прототипа: у него нет унаследованных свойств. Другие объекты-прототипы являются самыми обычными объектами, имеющими собственные прототипы. Все встроенные конструкторы (и большинство пользовательских конструкторов) наследуют прототип
<b>Object.prototype</b>
. Например,
<b>Date. prototype</b>
наследует свойства от
<b>Object.prototype</b>
, поэтому объект
<b>Date</b>
, созданный выражением
<b>new Date(),</b>
наследует свойства от обоих прототипов,
<b>Date.prototype</b>
и
<b>Object.prototype</b>
. Такая связанная последовательность объектов-прототипов называется цепочкой прототипов.