Краткое замечание о классах
Обратите внимание, что в таблице присутствует ссылка на понятие “класса”. 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.
Использование такого подхода дает две вещи:
- Определение анонимной функции
- Объявить объект с помощью ключевого слова new.
Такой способ определения объекта может показаться странным, но, это дает возможность создать лишь один экземпляр объекта с возможностью его инициализации.