Одно существенное отличие (хотя это не отвечает на , почему либо предпочтительнее) - это область действия.
В первом случае this.Name()
имеет доступ к любым другим переменным, объявленным ввнешняя функция, потому что это все одно замыкание.Он известен как «привилегированный метод».
Последняя версия, полностью объявленная вне первоначальной области видимости, не имеет доступа к этим «закрытым» переменным-членам.
Технически последний на самом деле болеепамять эффективна, так как эта функция создается только один раз.В первой версии внутренняя функция воссоздается каждый раз, когда создается экземпляр объекта этого типа.Если у вас есть только несколько таких объектов, это не имеет значения, но если вы собираетесь создать сотни из них, вам действительно следует использовать метод prototype
.
РЕДАКТИРОВАТЬ - относительно вашего редактирования модификаторов доступа:
Ну, на самом деле нет доступа модификация .
Первый метод создает «замыкание», изамыкания могут содержать объявления переменных, которые имеют локальную область видимости.Однако функция также является объектом, поэтому добавление свойств к this
открывает эти свойства для внешнего мира.Обычный способ «экспорта» метода или переменной заключается в следующем:
var MyType = function() {
var method = function() { ... }; // this is private variable
this.method = method; // this is a public property pointing
}; // to the private variable
С другой стороны, последний метод с литералом объекта не создает замыкание, это просто стек именованныхсвойства, чьи значения содержат ссылки на функции.
Все свойства объекта могут быть доступны извне, поэтому все, что создано с помощью литерала объекта, неявно является "открытым".