Как я могу перевести мой Module-Singleton JavaScript на вспомогательные экземпляры? - PullRequest
3 голосов
/ 17 мая 2011

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

var WidgetModule = (function($, options) {

    // Private variable
    var someVar;

    // Private functions
    function somePrivateFunction() {

    }

    // Define the public members
    var self = {
        init: function() {

        },
        someFunction: function() {

        }
    };

    return self;

})(jQuery, options);

Я столкнулся с ситуацией, когда у меня есть несколько модулей, для которых я хотел бы создать несколько экземпляров.

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

Ответы [ 2 ]

8 голосов
/ 17 мая 2011

Когда мне нужны общие функции для нескольких объектов, вот шаблон, который я обычно использую (настроенный для учета представленного вами кода):

var Widget = (function($) {
    var pubs = Widget.prototype;

    // Private variable -- global to all instances
    var someVar;

    // The constructor    
    function Widget(options) {
        var privateInstanceVar;

        this.privateInstanceFunc = function() {
            return privateInstanceVar;
        };
    }

    // Private functions -- global to all instances
    function somePrivateFunction() {

    }

    // Define the public members
    pubs.init = function() {

    };

    pubs.someFunction = function() {

    };

    return Widget;

})(jQuery);

Использование:

var w = new Widget({someOption: "here"});

Каквы можете видеть, что вы можете обмениваться личными данными среди всех экземпляров, созданных конструктором, и, если вы действительно этого хотите, вы можете иметь личные данные, которые доступны только определенным функциям select instance.Эти функции должны быть созданы в конструкторе, который имеет последствия повторного использования, тогда как функции, которым не нужны действительно частные данные экземпляра, могут находиться в прототипе и, следовательно, совместно использоваться всеми экземплярами.

Еще лучше,поскольку у вас уже есть удобная функция определения объема, вы можете помочь вашим инструментам помочь , присвоив вашим публичным функциям настоящие имена:

    pubs.init = Widget_init;
    function Widget_init() {

    }

Я в основном не кодирую вышесказанное, посколькуЯ определил вспомогательную фабрику, которая делает ее немного более лаконичной (и упрощает специализацию функциональности, например, Car наследование функциональности от Vehicle); подробности здесь .

0 голосов
/ 17 мая 2011

Что по этому поводу:

function WidgetModule(options){
    //var $ = jQuery;
    // Private variable
    var someVar;

    // Private functions
    function somePrivateFunction() {

    }

    // Define the public members
    var self = {
        init: function() {
          console.log(options.id);
        },
        someFunction: function() {

        }
    };

    return self;
}

var w1 = WidgetModule({id:1}),
    w2 = WidgetModule({id:2});

w1.init(); // --> 1
w2.init(); // --> 2
...