Оператор 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 :
Читать дальше
Конец ознакомительного отрывка
Купить книгу