Когда использовать классы, а когда функции?
Согласен с Ларисой, но немного дополню.
Классы, собственно, введены для любителей ООП, и действительно - только эмулируют в JS классическое ООП.
Нужны они для того, чтобы инкапсуллировать части кода, иметь возможности классового наследования и проч. Но нужно не забывать, что в JS используется наследование на прототипах и никакого другого в нем нет.
Если понять вышесказанное, то от классов в JS лучше отказаться, и использовать встроенные инструменты. Сразу скажу единственный минус, который я не смог чисто обойти - отсутствие множественного наследования.
Итак, инкапсулляцию лучше всего делать, размещая все функции отдельного блока кода не в классе, а в качестве методов объекта.var obj1= {
prop1: value,
met1: function(arguments) {
body
}
// etc
}
При таком подходе мы имеем в глобальном скопе лишь одну переменную, но можем вполне использовать весь ее потенциал, как:obj1.met1();
И зачем нам нужны классы при таком подходе?
Если нам нужно унаследовать от другого объекта, самым простым способом будет разместить ссылку на родительский объект в свойстве __proto__ наследника.var parent= {...};
var child= {
__proto__: parent,
.....
}
JS-классы — это так называемый «синтаксический сахар» для тех, кому больше нравится или кто больше привык писать именно в таком виде. На самом деле — это другой (по синтаксису) способ объявлять функции-конструкторы.
Подробнее — здесь https://learn.javascript.ru/es-class и здесь https://habrahabr.ru/post/175029/ 
Про функции-конструкторы можно почитать здесь: https://developer.mozilla.org/ru/docs/Web/JavaScri...