Основы ООП на Javascript

Объект представляет собой экземпляр класса.
Javascript — это объектно-ориентированный язык, но в нём нет классов, а вместо наследования на основе классов используется наследование на основе прототипов.

Объекты создаются при помощи выражений вида

var obj = new MyObj(param1, param2);

В приведённом примере за оператором new следует имя функции-конструктора MyObj.
Его главная задача, как обычно, установка всех свойств объекта перед дальнейшим использованием.

//определение конструктора
function Rectangle(width, height)
{
    this.width = width;
    this.height = height;
    this.area = function()
    {
        return this.width * this.height;
    }
}
//или
Rectangle = function(width, height)
{
    this.width = width;
    this.height = height;
    this.area = function()
    {
        return this.width * this.height;
    }
}
//создание объектов
var rect1 = new Rectangle(5, 7);
var rect2 = new Rectangle(3.2, 1);

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

Rectangle = function(width, height)
{
    this.width = width;
    this.height = height;
}
Rectangle.prototype.area = function()
{
	return this.width * this.height;
}
var rect1 = new Rectangle(5, 7);
var rect2 = new Rectangle(3.2, 1);

При чтении свойства объекта сначала проводится поиск среди его свойств, а затем среди свойств объекта-прототипа.
При записи — если такого свойства у объекта нет, то оно создаётся. К прототипу обращений нет. Сделано это для того, чтобы из одного объекта не поменять свойства всех объектов, созданных через тот же конструктор.

Аналоги классических ООП-конструкций:

Свойства объекта

rect1.width

Методы объекта

rect1.area()

Свойства класса

Rectangle.unit = new Rectangle(1, 1);

* Такая запись возможна потому, что все функции в javascript явлются объектами.

Методы класса

Rectangle.unitArea();

При этом ключевое слово this внутри метода класса ссылается на функцию-конструктор класса.

LEAVE A COMMENT