В Javascript не существует таких понятий, как "приватный" и "публичный".То, что вы видите, - это разница между свойствами объекта и захваченными переменными замыкания.Переменные захвата замыкания могут использоваться для скрытия состояния, но они скрывают его в другом объекте, прикрепленном к функциям, созданным в области замыкания, а не в возвращаемом объекте, как в других языках.Имея это в виду, я отвечу на ваши вопросы,
1) Я бы не стал использовать ни одну форму, но они стилистически похожи, оба используют захват закрытия.Обратите внимание, однако, что первый использует шаблон конструктора, а второй использует фабричный шаблон.Первый будет работать только в том случае, если вы используете ключевое слово new до вызова Bro, второй будет игнорировать объект, созданный new, в пользу объекта, созданного литералом объекта, но вы можете безопасно вызывать его без добавления префикса new.
2) storyName не является закрытым, оно задано для другого объекта.Когда вызывается функция с префиксом new, создается новый объект, который передается как параметр this.Это объект, который вы устанавливаете "this.storyName".Этот объект затем отбрасывается в пользу объекта, который вы создаете в литерале.Вы не видите storyName, потому что он не был установлен для возвращаемого объекта.
3) Вы можете записать это в переменную замыкания, такую как self, или использовать bind для функции, чтобы связать это с оригинальным this.Я предпочитаю захват закрытия самостоятельно.
4) Это все еще находится в области видимости, потому что вы выполняете в функции конструктора.