В этой записи я покажу как создать класс в JavaScript, добавить в него методы помощники, переменные (массивы и обычные) и остальные полезности. Разберем три варианта — используя функцию, объекты и синглетон.
1. Создадим класс из функции
Создавать классы в JavaScript просто, давайте посмотрим на первый вариант:
function Car() { this.types = [ 'bmw', 'mercedes', 'zhiguli' ]; this.add = function(name) { this.types.push(name); } }
Сам класс называется Car
, у него есть значение types
, которое является массивом со значениями разных марок автомобилей. Так же, там есть метод add()
, который выполняет функцию добавления новой марки автомобиля используя метод помощник push().
После этого мы можем инициализировать класс:
var c = new Car();
и добавить новую марку машины в массив types
:
c.add('kamaz');
Теперь выведем весь список марок в классе Car
:
console.log(c.types); // (4) ["bmw", "mercedes", "zhiguli", "kamaz"]
Добавим новые методы-помощники
Давайте добавим еще один метод — удаление определенной марки автомобиля (назовем его remove()
):
function Car() { this.types = [ 'bmw', 'mercedes', 'zhiguli' ]; this.add = function(name) { this.types.push(name); } this.remove = function(name) { // проверяем есть ли такое имя в масиве var index = this.types.indexOf(name); // index вернет "-1", если ничего не будет найдено if( index < 0 ) { console.log('Машина с именем ' + name + ' не существует.'); } // если что-то было найдено, используем метод splice для удаления этого элемента из масива this.types.splice(index, 1); } }
В коде выше описан весь процесс работы метода remove()
.
На что вам стоит обратить внимание:
indexOf()
не поддерживается в Internet Explorer 7 и 8. Для этого вам нужно будет использовать другой способ, например использовать полифилл или циклично пройтись по массиву и сравнить значение (только если он не большой).splice()
может удалять или добавлять новые элементы в массив. Я его использую для удаления элемента. Первый аргумент — это индекс, который нужно удалить, второй — это кол-во элементов для удаления.
Объект и синглетон
Остается еще два варианта создания классов в JavaScript: объект и синглетон.
Создадим объект
Возьмем класс Car
из функции которая была описана выше и сделаем из нее объект, и вот что из этого получается:
var car = { types: [ 'bmw', 'mercedes', 'zhiguli' ], add: function(name) { this.types.push(name); }, remove: function(name) { var index = this.types.indexOf(name); if( index < 0 ) { console.log('Машина с именем ' + name + ' не существует.'); } this.types.splice(index, 1); } }
Использовать этот объект можно следующим образом:
car.types; // (3) ["bmw", "mercedes", "zhiguli"] car.remove('bmw'); // ["bmw"]
Нам не нужно инициализировать (объявлять) класс, потому что он уже это сделал сам — это как переменная внутри которой есть параметры и методы.
Создадим синглетон
Теперь покажу как написать синглатон из того же класса, что у нас имеется (за основу я взял объект, так как эти два типа данных схожи):
var car = new function() { this.types = [ 'bmw', 'mercedes', 'zhiguli' ]; this.add = function(name) { this.types.push(name); }, this.remove = function(name) { var index = this.types.indexOf(name); if( index < 0 ) { console.log('Машина с именем ' + name + ' не существует.'); } return this.types.splice(index, 1); } };
Самое важное, что мне нужно объяснить в этом примере — это new function()
:
Она создает анонимный конструктор и вызывает (инициализирует) его сразу с new
, как самый первый класс. Этот вариант не самый распространенный и скорее всего вы о нем не знали, если не очень знакомы с JavaScript, но не плохо знать и такой вариант. Если вам нужно будет использовать класс лишь один раз, этот формат вам точно подойдет.
Послесловие
Как вы могли уже заметить, разница между тремя вариантами лишь в синтаксисе. Выбирайте какой вам нравится больше и осваивайте. Когда вы хорошо разберетесь в одном, то можете взяться и за остальные — они вам тоже пригодятся.
И да, в JavaScript не существует классов, все является объектами, поэтому в этой записи все упоминания связанные с «класс» на самом деле относятся к объектам.
Почему я сначала пишу «класс» и т.д., а в конце записи пишу совсем другое? Очень часто новички путаются, и чтобы самые внимательные (которые читаю до конца записи) знали как обстоят дела.
Если у вас возникли какие-либо вопросы — напишите его ниже к этой записи, я буду рад ответить вам.