Классы | Classes

В ES6 наконец то добавили поддержку классов. Новый синтаксис не вводит новую объектно ориентированную модель. Внутри используются всё теже прототипы. Новый синтаксис - это так называемый syntactic sugar или синтаксический сахар - который призван упростить работу с классами в JS.

  • Свойства класса можно указывать исключительно в конструкторе, за пределами конструктора - они работать не будут. Это обещают исправить в следующей версии JS.
  • Есть возможность указывать статические свойства и методы. Они принадлежат самому классу а не объекту. Их можно использовать для хранения вспомогательной информации.
  • Статические свойства добавляются в класс за пределами самого класса.
  • Статические методы объявляются в самом классе через ключевое слово static
  • Классы могут иметь особые свойства get и set. Внутри класса они выглядят как методы, а снаружи - как свойства. Эти свойства позволяют присвоить / получить доступ к настоящим свойствам объекта. Названия get и set свойств не должны совпадать с названиями основных свойств объекта.
  • У классов также как и у объектов названия свойств и методов могут быть вычеслены динамически.
class Task {
	
	// конструктор для объявления переменных
    constructor(title = Task.getDefaultTitle()) {
        this.title = title;
        this._done = false;
        Task.count += 1; // доступ к статическому свойству
        console.log('Создание задачи');
    }
    
	// геттер
    get done() { 
        return this._done === true ? 'Выполнена' : 'Не выполнена';
    }
    
	// сеттер
    set done(value) {
        if (value !== undefined && typeof value === 'boolean') {
            this._done = value;
        } else {
            console.error('Ошибка! Укажите значение true или false');
        }
    }
    
	// обычный метод
    complete() {
        this.done = 1; // доступ к переменной done через сеттер
        console.log(`Задача "${this.title}" выполнена`);
    }
    
	// статический метод
    static getDefaultTitle() {
        return 'Задача';
    }
}

Task.count = 0; // статическое свойство, объявленное за пределами класса

let task = new Task('Убрать комнату');
console.log(task.done, task._done);
task.complete();
console.log(task.done, task._done);

// Создание задачи
// Не выполнена false
// Ошибка! Укажите значение true или false
// Задача "Убрать комнату" выполнена
// Не выполнена false