Xiper

Краткое замечание о классах

Автор: Валерий Съестов Дата публикации:

Обратите внимание, что в таблице присутствует ссылка на понятие “класса”. JavaScript является бесклассовым языком (по крайней мере до спецификации EcmaScript 5, включительно), однако их можно смоделировать с помощью функций. Наиболее распространенный подход к достижению этой цели - это определение функции JavaScript и при объявлении объекта используется ключевое слово new. Ключевое слово this используется для определения свойств и методов этого объекта:

// A car "class"
function Car( model ) {
    this.model = model;
    this.color = "silver";
    this.year  = "2012";
    this.getInfo = function () {
        return this.model + " " + this.year;
    };
}

Теперь мы можем использовать наш класс Car для создания объекта:

var myCar = new Car("ford");
myCar.year = "2010";
console.log(myCar.getInfo());

Способы определения классов в JavaScript

1. Использование функций

1.1 Определение методов внутри функции конструктора

Вероятно это один из самых распространенных способов. Мы объявляем обычную функцию и после создаем объект с использованием ключевого слова new. Определение свойств и методов для этого объекта выполняется с помощью ключевого слова this, как показано в следующем примере:

function Apple (type) {
    this.type = type;
    this.color = “red”;
    this.getInfo = function () {
        return this.color + ‘ ‘ + this.type + ‘ apple’;
    };
}

Инстанцируем объект используя функцию конструктор Apple, установим некоторые свойства и вызовем метод следующим путем:

var apple = new Apple(‘macintosh’);
apple.color = ‘reddish’;
alert(apple.getInfo());
1.2 Определение методов с использованием prototype

Недостаток предыдущего способа заключается в том, что метод getInfo пересоздается каждый раз когда мы создаем объект используя конструкцию new. Иногда такой способ бывает оправдан, но в некоторых ситуациях это увеличивает нагрузку на приложение и использование памяти. Оптимальным вариантом выступает добавление метода getInfo с помощью prototype, функции конструктора.

function Apple(type) {
    this.type = type;
    this.color = ‘red’;
}
Apple.prototype.getInfo = function () {
	return this.color + ‘ ‘ + this.type + ‘ apple’;
};

Новые объекты создаются таким образом как в примере 1.1.

2. Использование объектов литералов

Литералы - это простой путь для определения объектов и массивов в JavaScript. Для определения пустого объекта, используем следующую конструкцию:
var o = {};
Вместо “нормального” пути
var o = new Object();

Таким образом, можно пропустить создание объекта класса, и создать объект немедленно.

var apple = {
	type: ‘macintosh’,
	color: ‘red’,
	getInfo: function () {
		return this.color + ‘ ‘ + this.type + ‘ apple‘;
	}
};

В этом случае вам не нужно создавать экземпляр класса, он уже существует. Таким образом, вы просто берете и используете этот экземпляр.

Такой объект также иногда называют Синглтон. В «классических» языках, таких как Java, Синглтон означает, что вы можете иметь только один экземпляр этого класса в любое время, вы не можете создать более объектов того же класса.

3. Singleton с использованием функции

Третий способ представленные в этой статье является комбинацией двух других описанных выше. Вы можете использовать функцию для определения единственного объекта. Синтаксис этого способа представлен ниже:

var apple = new function () {
this.type = ‘macintosh’;
	this.color = ‘red’;
	this.getInfo = function () {
		return this.color + ‘ ‘ + this.type + ‘ apple’;
       }
};

Как видите, этот способ похож на тот который описан в пункте 1.1 и 2.

Использование такого подхода дает две вещи:

  1. Определение анонимной функции
  2. Объявить объект с помощью ключевого слова new.

Такой способ определения объекта может показаться странным, но, это дает возможность создать лишь один экземпляр объекта с возможностью его инициализации.