Ответ 1
Второй пример кода - это правильный способ добиться того, что вы ищете. Вы создаете сразу исполняемую функцию, внутри которой вы создаете новую функцию, добавляете ее прототип и возвращаете ее.
Первый пример - бит нечетный и не совсем корректно создает конструктор. Строка
return Car.prototype; // return with prototype
заставляет функцию Car просто всегда возвращать литерал объекта, который вы ранее назначили Car.prototype
. Это переопределяет нормальное поведение функции, вызываемой с помощью new
Отметим только одну вещь:
Car.prototype = {
newColor: function(color) { private.color = color },
getColor: function() { return private.color }
};
приведет к тому, что свойство constructor
вновь созданных объектов перестанет указывать на вашу функцию Car. Есть два простых способа исправить это, если это важно для вас.
Car.prototype = {
newColor: function(color) { private.color = color },
getColor: function() { return private.color }
};
Car.prototype.constructor = Car; // <-------- add this line
Или измените приведенное выше на
Car.prototype.newColor = function(color) { private.color = color };
Car.prototype.getColor = function() { return private.color };