• Почему в конструкторе не могу написать так?

    e-vyushin
    @e-vyushin
    Frontend engineer
    Думаю основная причина почему кажется что это должно работать — это непонимание разницы между функцией в JS и методом объекта. Это не одно и то же, несмотря на то что оба варианта можно вызвать подписав скобочки () в конце :) Да, вызывать можно и функцию и метод объекта, а вот создавать экземпляры методов нельзя.

    В указанном Вами примере внутри функции Man вызывается new this.Man. Это означает, что создаётся экземпляр Man, а значит сам Man должен иметь конструктор (грубо говоря быть классом).

    Функции в JS имеют конструктор, а методы объектов не имеют. Функции и методы объектов это не одно и то же. Рассмотрим такой пример:

    const obj = {
       Man() {}
    }

    в данном случае Man() это просто метод объекта. У него нет своего конструктора. Т. е. нельзя создать его экземпляры через new. Но можно его вызвать:

    const obj = {
       Man() {}
    }
    obj.Man();

    это корректный вариант.

    Но создавать экземпляры нельзя. Например:

    const obj = {
       Man() {}
    }
    new obj.Man(); // Будет ошибка. TypeError: obj.Man is not a constructor

    А вот экземпляры функции можно создавать. Например:

    const obj = {
       Man: function() {}
    }
    new obj.Man(); // Всё ок

    для того чтобы создать экземпляр функции не обязательно конечно чтобы она была внутри объекта. Можно и так:

    const Man = function() {}
    new Man(); // Всё ок

    При желании можно поискать инфу на тему почему можно создавать экземпляры функции. Говоря вкратце, раньше в JS не было классов, по-этому наследование было реализовано через прототип функции. Это немного нелепо конечно, но в JS можно создавать экземпляры функции как если бы функция была классом. Сегодня в JS уже есть классы, так что лучше использовать их.

    Вывод: методы объекта и функции это не одно и то же.
    Ответ написан
    1 комментарий
  • Как подправить календарь на чистом javascript?

    @dimoff66
    Кратко о себе: Я есть
    Все куда проще

    function showCalendar(month, year) {
    
          //Берем текущую дату
          const currDay = new Date(year, month);
          
          //Находим дату начала недели
          currDay.setDate(currDay.getDate() - currDay.getDay() + 1);
          
          //Делаем заголовок дней недели
          const tbl = document.getElementById("calendar-body"); 
          tbl.innerHTML = '<tr><th>пн</th><th>вт</th><th>ср</th><th>чт</th><th>пт</th><th>сб</th><th>вс</th>';
          
          // filing data about month and in the page via DOM.
          monthAndYear.innerHTML = months[month] + " " + year;
         
          //Пока понедельник не выходит за пределы текущего месяца
          // добавляем строки
          while(currDay.getMonth() <= month) {
             const row = document.createElement("tr");
             for(let i = 0; i < 7; i++) {
                row.innerHTML += '<th>' + currDay.getDate() + '</th>';
                //Увеличиваем дату на единицу
                currDay.setDate(currDay.getDate() + 1);
             }
             tbl.appendChild(row);  
          }
    }
    Ответ написан
    4 комментария