И для чего нужно _dogName, если есть просто dogName?
Геттеры и сеттеры -- Классика жанра. Они нужны чтобы у пользователей класса не было полного доступа к внутренностям класса Dog. Чтобы разработчик класса мог контроллировать установку значения dogName. Например:
const blackList = ['Мурзик', 'Васька', 'Эпифантий'];
// ...
set dogName(value)
{
if (!value || !_.isString(value)) {
throw new Error('value must be a string!') ;
}
if (blackList.includes(value) {
throw new Error('wrong value!') ;
}
this._dogName = value;
}