Основы ООП на Javascript
Объект представляет собой экземпляр класса.
Javascript — это объектно-ориентированный язык, но в нём нет классов, а вместо наследования на основе классов используется наследование на основе прототипов.
Объекты создаются при помощи выражений вида
1 |
var obj = new MyObj(param1, param2); |
В приведённом примере за оператором new следует имя функции-конструктора MyObj.
Его главная задача, как обычно, установка всех свойств объекта перед дальнейшим использованием.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//определение конструктора 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, которое инициализируется в момент определения функции.
Любые свойства прототипа становятся свойствами объектов, созданных через конструктор.
1 2 3 4 5 6 7 8 9 10 11 |
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); |
При чтении свойства объекта сначала проводится поиск среди его свойств, а затем среди свойств объекта-прототипа.
При записи — если такого свойства у объекта нет, то оно создаётся. К прототипу обращений нет. Сделано это для того, чтобы из одного объекта не поменять свойства всех объектов, созданных через тот же конструктор.
Аналоги классических ООП-конструкций:
Свойства объекта
1 |
rect1.width |
Методы объекта
1 |
rect1.area() |
Свойства класса
1 |
Rectangle.unit = new Rectangle(1, 1); |
* Такая запись возможна потому, что все функции в javascript явлются объектами.
Методы класса
1 |
Rectangle.unitArea(); |
При этом ключевое слово this внутри метода класса ссылается на функцию-конструктор класса.
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.