Посмотрим на два примера, в которых я попытаюсь объяснить, что я хочу понять.
var Car = function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };
  return Car.prototype; // return with prototype
};
var myCar = new Car();
и
var Car = (function(){
  // Init class
  function Car() { };
  // Private func/vars
  var private = { color:'red' };
  // Public func/vars
  Car.prototype = {
    newColor: function(color) { private.color = color },
    getColor: function() { return private.color }
  };
  return Car; // avoid prototype adding parentheses on next line;
})();
var myCar = new Car();
Посмотрим!, Оба класса создаются как выражение функции, и оба работают одинаково. Единственные различия между ними: Первый возвращает функцию Car со свойством прототипа. Вторая работа возвращает функцию Car, избегая свойства прототипа и вместо этого использует IIFE.
В чем разница между использованием return Car.prototype; и избежанием IIFE и использованием return Car; с использованием IIFE (круглые скобки в конце объявления класса).