04. Объекты
Классы
![]() |
Создавать объекты при помощи литералов не слишком интересно. В объектно-ориентированном программировании сначала описывают класс, затем при помощи функции-конструктора, создают объекты — экземпляры класса. Класс выступает в роли документации на объект, в нём описываются: свойства, методы и функция-конструктор. |
Создание объекта при помощи конструктора
В JavaScript экземпляр класса создаётся при помощи следующей конструкции:
var переменная = new Конструктор(аргументы);
Конструктор — это функция, которая выполняет инициализацию свойств объекта и работает вместе с оператором new (оператор создания объекта).
Пример
var empty = new Object();
Object — это конструктор встроенного класса Object, реализующего общие возможности всех JavaScript-объектов. Object — это надкласс всех остальных классов, все объекты JavaScript наследуют от Object свойства, методы и поведение. Отметим два метода класса Object:
Возвращает строковое представление объекта.
Пример
var empty = new Object();
empty.toString() // вернёт строку "[object Object]"
Запись "[object Object]" можно «перевести» как «объект класса Object». Как видите, не очень много полезной информации! Поэтому подклассы, образованные от Object, переопределяют метод toString(). Например, true.toString() вернёт строку "true", а false.toString() вернёт строку "false", так как для обёртки Boolean метод toString() переопределён именно так.
Важно понимать, что так или иначе, но метод toString() работает для всех объектов JavaScript.
Еще один интересный пример:
function (x) {return x+1;}.toString() // вернёт строку "function (x) {return x+1;}"
Должен возвращать элементарное значение объекта (число, строку, логическое значение).
Для объекта класса Object метод вернёт ту же неинтересную строку "[object Object]", что и метод toString(). Поэтому подклассы, образованные от Object, переопределяют метод valueOf(). Например, [1,2,3].valueOf() вернёт строку "1,2,3".
Важно понимать, что так или иначе, но метод valueOf() работает для всех объектов JavaScript.
Заметим, что две следующие строки эквивалентны:
var empty = new Object();
var empty = {}; // Неявный вызов конструктора Object
Создание собственного класса
Создадим класс для работы с прямоугольниками. Опишем конструктор следующим образом:
// Конструктор класса Rectangle (прямоугольник).
// Создает и инициализирует в экземпляре класса свойства width и height,
// а также метод square() -- вычисление площади.
// Переопределяет стандартный метод toString().
function Rectangle(width,height)
{
this.width = width;
this.height = height;
this.square = function () {return this.width*this.height};
this.toString = function () // Переопределение метода из класса Object
{
return "Прямоугольник: " + this.width + "x" + this.height;
};
}
А теперь попробуем поработать с этим классом.
var rect1 = new Rectangle(2,3); // Создан первый экземпляр класса
var rect2 = new Rectangle(4,5); // Создан второй экземпляр класса
Оператор new работает следующим образом:
- Сначала создаёт пустой объект (как экземпляр встроенного объекта Object).
- Затем вызывает функцию-конструктор, передавая ей созданный объект в качестве ключевого слова this.
Функция-конструктор создает в этом объекте три свойства — width, height, square и присваивает им значения, согласно коду конструктора. Что касается четвёртого свойства toString, то оно уже было в объекте, созданном new (это свойство наследуется от Object). Функция конструктор присваивает этому свойству новое значение, переопределяя тем самым, метод toString объекта Object.
Поработаем с созданными объектами.
var x = rect1.width; // Равно 2
var y = rect2.height; // Равно 5
var z = rect1.square(); // Равно 6
var t = rect2.toString(); // Равно "Прямоугольник 4x5"
var l = rect1.valueOf(); // Равно "Прямоугольник 2x3"
Последний опыт говорит о том, что по умолчанию в классе Object метод valueOf(), вероятно, просто ссылается на метод toString().
Говорю «вероятно», потому что не знаю это достоверно, но опыты показывают, что мое предположение похоже на правду :)