NazimovDmitrii
8/2/2019 - 4:33 PM

[Пример наследования в JS ES6] #ООП #js #ES6

[Пример наследования в 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