2014-05-01 4 views
3

В настоящее время я разрабатываю приложение Javascript большого размера (одна страница), и я искал в Интернете, чтобы найти некоторые лучшие практики. Большинство проектов используют шаблон модуля, поэтому объекты не загрязняют глобальное пространство имен. В этот момент я пользуюсь обычными объектами:Javascript 'normal' objects vs module pattern

function LoginModel(){ 
    this.model = new MyModel(); 

    this.getModel = function(){ 
     return this.model; 
    }; 
} 

Это легко читаемый и простой в обслуживании (мое мнение). Лучше ли использовать шаблон модуля только из-за пространства имен или у него есть другие преимущества, о которых я не знаю (встречные утечки памяти, ...)? Кроме того, я уже разделил файлы, чтобы иметь хороший шаблон MVC и уничтожить каждый объект, когда это необходимо (утечка памяти счетчика). Итак, главный вопрос: мне нужно, в моем случае, использовать шаблон модуля или нет?

шаблон модуля:

var LoginModel = (function(){ 
    var model = MyModel; 

    function getModel(){ 
     return model; 
    }; 

    return { 
     getModel: getModel 
    }; 
}); 
+1

Возможный дубликат [почему шаблон модуля?] (Http://stackoverflow.com/questions/7471349/why-module-pattern) – thefourtheye

ответ

2

Если вы собираетесь использовать только один экземпляр на странице, я не вижу необходимости включать ключевое слово new. Поэтому лично я бы создал модуль выявления, как в последнем примере, и выставлял объект с «общедоступными» свойствами.

Хотя я не вижу вашу точку с функцией getModel(), так как MyModel, очевидно, доступен за пределами области действия.

Я бы переписать его немного:

var LoginModel = (function(model, window, undefined){ 

    function init(){ } // or whatever 

    function doSomethingWithModel(){ 
     console.log(model); 
    } 

    return { init: init }; 

})(MyModel, window); 

Если вы не уверены, какие модули, которые получат model, вы можете использовать свободные augumentation и изменить

})(MyModel, window); 

в

})(MyModel || {}, window); 

Если вам нужны несколько экземпляров модуля, это будет выглядеть как-то как это:

var LoginModel = (function(model, window, undefined){ 

    function loginModel(name){ // constructor 
     this.name = name; // something instance specific 
    } 

    loginModel.prototype.getName = function(){ 
     return this.name; 
    }; 

    return loginModel; 

})(MyModel, window); 

var lm1 = new LoginModel('foo'); 
var lm2 = new LoginModel('bar'); 

console.log(lm1.getName(), lm2.getName()); // 'foo', 'bar' 
+0

Невозможно принять оба ответа, но они великолепны. Я действительно понимаю, что вы оба упомянули, и переключил код, чтобы использовать «раскрывающийся шаблон модуля»! Спасибо за помощь :) – GuyT

+0

@GuyT Мое удовольствие! – Johan

3

Модуль модель лучше для общей организации кода. Он позволяет иметь данные, логику и функции, которые являются частными для этой области.

В вашем втором примере getModel() только способ получить модель снаружи. Переменная, объявленная в модуле, скрыта, если явно не открыто. Это может быть очень удобно.

И нет на самом деле никакого недостатка, кроме как немного более сложного. Вы просто получите больше возможностей для организации и инкапсуляции.

Я бы использовал простой объект, пока моя модель не станет достаточно сложной, чтобы обладать большей структурой и некоторыми частными областями. И когда вы попали в эту точку, тривиально переопределить его как раскрывающий модуль, не нарушая какой-либо код, который его использует.

+0

+1 для простого подхода к модулю - это отличное предложение. – Johan

1

Там в несколько концепций сплавлены в вашем вопросе

С, что вы называете «нормальный объект», то функция становится функцией конструктора и требует нового ключевого слова.

Второй пример использует шаблон раскрывающегося модуля внутри IIFE. Это самый популярный вариант шаблона модуля, но, к сожалению, он сильно испорчен.Для объяснения различий см. Мой ответ here и его недостатки, см. here.

Теперь ваш вопрос создает ложную дихотомию - нормальные объекты или шаблон модуля? Вам не нужно делать выбор - обычный объект может использовать шаблон модуля, просто вкладывая все, что он хочет сохранить в своей закрытой области. Например,

function LoginModel(){ 
    var _notifyListeners = function(){ 
     // Do your stuff here 
    }; 

    this.model = new MyModel(); 

    this.getModel = function(){ 
     _notifyListeners(); 
     return this.model; 
    }; 
} 

Это пример «нормального объекта» с использованием шаблона модуля. То, что вам нужно избегать, - это то, что делает шаблон раскрывающегося модуля - помещение всего в область закрытия. Вы должны только помещать вещи, которые хотите сохранить в закрытом пространстве.