2013-03-06 3 views
2

У меня есть куча «модулей», которые следуют за "JavaScript Module Pattern" as described in this popular article. Насколько я понимаю, эти модули являются способом объединения различных бит поведения в опрятные пространства имен.Могу ли я использовать классы с шаблоном модуля javascript?

Но что, если я хочу, чтобы создать уникальный экземпляр объекта, который принимает аргументы? Как бы то ни было, я не могу этого сделать, поскольку все данные являются общими/статическими. Я хочу быть в состоянии сделать это:

var foo = new Some.Namespace.Whatever.Foo(config); 

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

+0

Я не понимаю, в чем проблема. Почему у вас нет класса в качестве члена модуля? – benekastah

+0

@benekastah Если я это сделаю, то любые данные, которые я передаю, разделяются другими экземплярами, когда я использую 'new'. –

+0

Я так не думаю. Я добавил ответ, что должен работать, если я правильно понял проблему. – benekastah

ответ

4

Почему бы не попробовать это?

var MODULE = (function() { 
    var my = {}; 

    my.SomeClass = SomeClass; 
    function SomeClass(six) { 
    this.six = six; 
    } 
    SomeClass.prototype.five = 5; 

    return my; 
})(); 

Когда вы позвоните var obj = new MODULE.SomeClass(6), он даст вам новый объект. obj.five разделяется между всеми экземплярами SomeClass, поскольку он прикреплен к прототипу. Тем не менее, obj.six специфичен для этого экземпляра, поскольку он присоединен к obj.

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

+0

OK Я думаю, что моя проблема заключалась в том, что все данные и поведение были привязаны к пространству имен, тогда как, как вы это делали, данные экземпляра привязаны только к экземпляру. –

+0

Прототип предназначен для наследования, а также помогает уменьшить дублирование. Поскольку у каждого экземпляра, вероятно, будут одинаковые методы, вы ставите методы на прототип. Это означает, что каждый экземпляр использует методы, а не каждый, имеющий свои собственные копии. Это уменьшает использование памяти. – benekastah

+0

Да имеет смысл. Теперь я понимаю, что вы подразумеваете под перекрытием между шаблоном модуля и классом. Благодарю. –

3

Это, вероятно, чрезмерное использование шаблона модуля, но это то, что вы имеете в виду ?:

var Some = (function() { 
    var util = { /* ... */ }; 
    return { 
     Namespace: (function() { 
      return { 
       Whatever: (function() { 
        var Foo = function(config) { 
         this.foo = config.foo || "foo"; 
         this.bar = config.bar || "bar"; 
        }; 
        var Bar = function() {}; 
        Foo.prototype.toString = function() { 
         return this.foo + " " + this.bar; 
        }; 
        return { 
         Foo: Foo, 
         Bar: Bar 
        } 
       }()) 
      }; 
     }()) 
    }; 
}()); 

var foo = new Some.Namespace.Whatever.Foo({foo: "hello", bar: "world"}); 
foo.toString() // "hello world" 
+0

Прохладный гнездование. Разве это не «раскрывающий шаблон модуля», а не «шаблон модели ванили»? –

+0

@BobbyB: Я полагаю, что, по крайней мере, самый сокровенный. Однако я никогда не беспокоился о названиях паттернов. –

 Смежные вопросы

  • Нет связанных вопросов^_^