В главе 7 демонстрировался порядок создания новых пустых объектов как с по_ мощью литерала {}, так и с помощью следующего выражения:
new Object()
Кроме того, была продемонстрирована возможность создания объектов других типов примерно следующим образом:
1 Полноценную поддержку классов планируется реализовать в JavaScript 2.0.
166 Глава 9. Классы, конструкторы и прототипы
var array = new Array(10); var today = new Date( );
За оператором new должно быть указано имя функции_конструктора. Оператор создает новый пустой объект без каких_либо свойств, а затем вызывает функ_ цию, передавая ей только что созданный объект в виде значения ключевого слова this. Функция, применяемая совместно с оператором new, называется функцией' конструктором, или просто конструктором. Главная задача конструктора за_ключается в инициализации вновь созданного объекта – установке всех его свойств, которые необходимо инициализировать до того, как объект сможет ис_ пользоваться программой. Чтобы определить собственный конструктор, доста_ точно написать функцию, добавляющую новые свойства к объекту, на который ссылается ключевое слово this. В следующем фрагменте приводится определе_ ние конструктора, с помощью которого затем создаются два новых объекта:
// Определяем конструктор.
// Обратите внимание, как инициализируется объект с помощью "this". function Rectangle(w, h) {
this.width = w; this.height = h;
}
// Вызываем конструктор для создания двух объектов Rectangle. Мы передаем ширину и высоту
// конструктору, чтобы можно было правильно проинициализировать оба новых объекта.
var
rect1
=
new
Rectangle(2, 4);
//
rect1
=
{
width:2, height:4 };
var
rect2
=
new
Rectangle(8.5, 11); //
rect2
=
{
width:8.5, height:11
};
Обратите внимание на то, как конструктор использует свои аргументы для ини_ циализации свойств объекта, на который ссылается ключевое слово this. Здесь мы определили класс объектов, просто создав соответствующую функцию_кон_ структор – все объекты, созданные с помощью конструктора Rectangle(), гаран_ тированно будут иметь инициализированные свойства width и height. Это означа_ ет, что учитывая данное обстоятельство, можно организовать единообразную ра_ боту со всеми объектами класса Rectangle. Поскольку каждый конструктор опре_ деляет отдельный класс объектов, стилистически очень важно присвоить такое имя функции_конструктору, которое будет явно отражать класс объектов, созда_ ваемых с ее помощью. Например, строка new Rectangle(1, 2), создающая объект прямоугольника, выглядит гораздо более понятно, нежели new init_rect(1, 2).
Обычно функции_конструкторы ничего не возвращают, они лишь инициализи_ руют объект, полученный в качестве значения ключевого слова this. Однако для конструкторов допускается возможность возвращать объект, в этом случае возвра_ щаемый объект становится значением выражения new. При этом объект, передан_ ный конструктору в виде значения ключевого слова this, просто уничтожается.