Объект внутри объекта

Есть фрагмент кода с созданием объекта.

const time = {
        date: new Date(),
        hours: this.date.getHours(),
};

В консоли получаю ошибку

Uncaught TypeError: Cannot read property ‘getHours’ of undefined

Почему так происходит? Что я не учитываю?

На стадии выполнения и резолва объекта this еще не будет ссылаться на объект, поэтому и ошибка.
так будет работать:
const date = new Date(); const time = { date: date, hours: date.getHours() };

в общем-то про this правильно сказали в предыдущем комментарии. с минимальными изменениями исходный пример я бы написал с геттером:

const time = {
    date: new Date(),
    get hours() {
        return this.date.getHours();
    }
};
console.log(time.date);  // 2019-05-24T09:22:38.018Z
console.log(time.hours);  // 12

таким образом условный “api” работы с объектом не поламается, по прежнему можно через точно получить date и hours, но будет работать правильно. а вообще для чего-то более сложного лучше использовать классы.

4 лайка

Как вариант
const time = {
hours: new Date().getHours()
};

Это я понимаю. Просто дальше будет min: new Date().getMinutes(), seconds: new Date().getSeconds()… и уже не очень чисто получается.

Вот, это именно то, что нужно. Огромное спасибо)

Да через геттеры более лаконично и красивее. Только возможность перегрузки методов исчезает, если такое нужно будет.