Оператор new создает и инициализирует новый объект. За этим оператором должно следовать имя функции. Функция, используемая таким способом, называется конструктором и служит для инициализации вновь созданного объекта. Базовый JavaScript включает множество встроенных конструкторов для создания объектов базового языка. Например:
var о = new Object(); // Создать новый пустой объект: то же, что и {}.
var а = new Аггау(); // Создать пустой массив: то же, что и [].
var d = new Date(); // Создать объект Date, представляющий текущее время
var г = new RegExp("js"); // Создать объект RegExp для операций
// сопоставления с шаблоном.
Помимо этих встроенных конструкторов имеется возможность определять свои собственные функции-конструкторы для инициализации вновь создаваемых объектов. О том, как это делается, рассказывается в главе 9.
Прежде чем перейти к третьему способу создания объектов, необходимо сделать паузу, чтобы познакомиться с прототипами. Каждый объект в языке JavaScript имеет второй объект (или null
, но значительно реже), ассоциированный с ним. Этот второй объект называется прототипом, и первый объект наследует от прототипа его свойства.
Все объекты, созданные с помощью литералов объектов, имеют один и тот же объект-прототип, на который в программе JavaScript можно сослаться так: Object.prototype
. Объекты, созданные с помощью ключевого слова new
и вызова конструктора, в качестве прототипа получают значение свойства prototype
функции-конструктора. Поэтому объект, созданный выражением new Object()
, наследует свойства объекта Object.prototype
, как если бы он был создан с помощью литерала в фигурных скобках {}
. Аналогично прототипом объекта, созданного выражением new Array(),
является Array.prototype
, а прототипом объекта, созданного выражением new Date(),
является Date.prototype
.
Object.prototype
- один из немногих объектов, которые не имеют прототипа: у него нет унаследованных свойств. Другие объекты-прототипы являются самыми обычными объектами, имеющими собственные прототипы. Все встроенные конструкторы (и большинство пользовательских конструкторов) наследуют прототип Object.prototype
. Например, Date. prototype
наследует свойства от Object.prototype
, поэтому объект Date
, созданный выражением new Date(),
наследует свойства от обоих прототипов, Date.prototype
и Object.prototype
. Такая связанная последовательность объектов-прототипов называется цепочкой прототипов.
Описание механизма наследования свойств приводится в разделе 6.2.2. Как получить ссылку на прототип объекта, рассказывается в разделе 6.8.1. А в главе 9 более детально будет обсуждаться связь между прототипами и конструкторами: там будет показано, как определять новые «классы» объектов посредством объявления функций-конструкторов и как записывать ссылку на объект-прототип в их свойство prototype для последующего использования «экземплярами», созданными с помощью этого конструктора.
Стандарт ECMAScript 5 определяет метод Object.create(),
который создает новый объект и использует свой первый аргумент в качестве прототипа этого объекта. Дополнительно Object.create()
может принимать второй необязательный аргумент, описывающий свойства нового объекта. Описание этого второго аргумента приводится в разделе 6.7.
Object.create()
является статической функцией, а не методом, вызываемым относительно некоторого конкретного объекта. Чтобы вызвать эту функцию, достаточно передать ей желаемый объект-прототип:
var о1 = Object.create({x:1, у:2}); // о1 наследует свойства х и у.
Чтобы создать объект, не имеющий прототипа, можно передать значение null
, но в этом случае вновь созданный объект не унаследует ни каких-либо свойств, ни базовых методов, таких как toString()
(а это означает, что этот объект нельзя будет использовать в выражениях с оператором +):
var о2 = Object.create(null); // о2 не наследует ни свойств, ни методов
.
Если в программе потребуется создать обычный пустой объект (который, например, возвращается литералом {} или выражением new Object()
), передайте в первом аргументе Object.prototype
:
Читать дальше
Конец ознакомительного отрывка
Купить книгу