Сегодня отвечал на вопросы, встретился такой (немного изменен):



А можно заставить функцию в объекте выполниться, когда я вывожу весь объект через console.log?

```
const selection = {
friends: () => ['Павел', 'Игорь', 'Настя'],
};

console.log(selection); // { friends: [Function: friends] }
```

Короткий ответ - нет :) Сам console.log ничего не выполняет, он просто показывает инвентаризацию, какие свойства и какие значения внутри лежат. А функция - это ведь такое же значение, как 42 или 'Вася'. Функция оживает только при явном вызове, вроде selection.friends().

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

```
const byMethod = {
friends() { return ['Павел', 'Игорь']; },
};
const byGetter = {
get friends() { return ['Павел', 'Игорь']; },
};

console.log(byMethod); // { friends: [Function: friends] }
console.log(byGetter); // { friends: [Getter] } - массива все так же нет

console.log(byMethod.friends); // [Function: friends] - рецепт
console.log(byGetter.friends); // [ 'Павел', 'Игорь' ] - тут получили готовый массив
```

Геттер все равно не заставляет console.log выполнить код, когда объект печатается, геттеры все равно не будут вычисляться. Геттер меняет другое - чтение свойства. Если мы обратимся к byGetter.friends, то код в геттере выполнится и вернет результат.

Есть еще возможность "печатать объект по-особому", речь про toString и Symbol.toPrimitive. Но это уже отдельная история ;)
Просмотры: 11
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти