Я подписался на курс по основам JS, организованный Флавио Копесом. Каждый день Флавио рассылает участникам электронные письма с парой вопросов/задач. Всего должно быть 35 писем. Отвечать на них не обязательно, но ответы на вопросы являются важной частью курса. Поэтому я решил поделиться своими ответами с миром: в лучшем случае это может помочь кому угодно, кроме меня, в худшем — только мне.

Есть ли разница между объектом, определенным с помощью синтаксиса литерала объекта, и объектом, созданным с помощью конструктора Object()?

Литеральный синтаксис позволяет создавать только синглтоны. Это означает, что созданный объект будет представлен как единственный уникальный экземпляр.

Синтаксисы на первый взгляд очень похожи, но есть нюансы. Синтаксис литерала объекта всегда один и тот же, тогда как конструктор Object() позволяет создавать новые экземпляры в более простом режиме, например:

В этом примере я использовал пользовательский конструктор с именем «Собака»; необходимо определить такой конструктор перед созданием экземпляров.

Какими различными способами мы можем получить доступ к значению свойства объекта?

Возьмем объект dogLiteral из предыдущего ответа:

Доступ через скобки позволяет нам передавать нестандартные имена свойств, которые, например, начинаются с подчеркивания. Обычная точечная нотация не позволяет обращаться к свойствам с символами подчеркивания. В любом случае настоятельно не рекомендуется использовать такие странные имена для свойств объекта, так как это может создать неожиданные проблемы при дальнейшем использовании объекта или при обращении к нему.

Чем метод отличается от функции? Пришлите мне образец метода и образец функции.

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

Таким образом, мы должны либо использовать синтаксис старой школы ES5:

или современный синтаксис ES6+:

Наконец, вот пример стрелочной функции. Вот как метод bark может быть функцией: