[Пример наследования в JS ES6] #ООП #js #ES6
// Если сделать вот так, то свойство _done реально становится приватным.
const _done = Symbol('done');
class Task {
constructor(title, initiateMessage = 'Создание задачи') {
this.title = title; // Зачем нижнее подчеркивание: название геттеров и сеттеров не должно совпадать
// с названием свойств обьекта. И т.к. здесь у нас есть сеттеры/геттеры, то свойству обьекта
// добавили нижнее почеркивание, чтобы не было ошибки.
// Таким образом свойство становится ПРИВАТНЫМ (на самом деле с ним можно делать что хочешь, но
// по соглашению такие свойства приватные).
//this._done = false;
//вариант с символом:
this[_done] = false;
Task.count += 1; // Статическое свойство.
this.printMessage(initiateMessage);
}
printMessage(msg) { // метод
console.log(msg);
}
get done() { // геттер
return this[_done] == true ? 'Выполнено' : 'НЕ выполнено';
}
set done(val) { // сеттер
if (val) {
this[_done] = val;
} else {
console.error('Неверное значение done');
}
}
static getDefaultTitle() { //статический метод
return 'Задача';
};
complete(msg = `Задача "${this.title}" выполнена`) { // метод
this[_done] = true; // здесь не _done, а done поскольку вызываем метод-сеттер set done(val);
console.log(msg);
}
}
Task.count = 0; // инициализация статического свойства внутри Task.
class SubTask extends Task {
constructor(title, parent) {
super(title, 'Создание ПОДзадачи'); // вызываем конструктор родителя с нужными нам аргументами.
this.parent = parent;
}
complete() {
super.complete(`ПОДзадача "${this.title}" выполнена`); // изменяем метод из родителя подставляя нужный нам аргумент.
}
}
let task = new Task('Сходить на бокс');
let subTask = new SubTask('Не получить по морде', task);
console.log(SubTask.getDefaultTitle()); // Проверка: унаследован ли статическиский метод от Таск к сабстаск.
console.log(SubTask.count); // Проверка: унаследовано ли статическое свойство от Таск к сабстаск.
console.log(task); // Смотрим экземплятр класса Task
console.log(subTask); // Смотрим экземплятр класса subTask