2012-06-27 17 views
5

Próbuję objąć głowicę modułami javascript, ale nie jestem pewien, jak podzielić moduł na kolejne moduły podrzędne. Czytałem, że funkcje zagnieżdżone nie są świetnym pomysłem ze względu na wydajność, więc jak mogę podzielić funkcję w module? Na przykład, powiedzmy, że mam następujący moduł:Wzorzec modułu JavaScript, funkcje zagnieżdżone i moduły podrzędne

var Editor = {}; 

Editor.build = (function() { 
    var x = 100; 
    return { 
     bigFunction: function() { 
      // This is where I need to define a couple smaller functions 
      // should I create a new module for bigFunction? If so, should it be nested in Editor.build somehow? 
     } 
    }; 
})(); 

bigFunction jest powiązany tylko z Editor.build. Czy powinienem dołączyć mniejsze funkcje tworzące bigFunction do prototypowego obiektu bigFunction? Nie jestem nawet pewien, czy to miałoby sens.

var Editor = {}; 

Editor.build = (function() { 
    var x = 100; 
    return { 
     bigFunction: function() { 
      bigFunction.smallFunction(); 
      bigFunction.prototype.smallFunction = function(){ /*do something */ }; 
      // not sure if this even makes sense 
     } 
    }; 
})(); 

Czy ktoś może mnie tu podrzucić we właściwym kierunku? Jest wiele mylących informacji w Internecie i chciałbym po prostu wskazać, jak sobie poradzić z tego typu modularyzacją.

Dziękuję.

Odpowiedz

0

Oto urywek mogę używać, aby nazwy dla wejścia:

var dynamicCounter = 0; 
    //custom dropdown names 
    var createContainerNames = function() { 
     function Names() { 
      this.id = "Tasks_" + dynamicCounter + "__ContainerId"; 
      this.name = "Tasks[" + dynamicCounter + "].ContainerId"; 
      this.parent = "task" + dynamicCounter + "Container"; 
     } 
     Names.prototype = { constructor: Names }; 
     return function() { return new Names(); }; 
    }(); 

A potem użyć go:

var createdNames = createContainerNames(); 
    var createdId = createdNames.id; 
    dynamicCounter++; 
    var differentNames = createContainerNames(); 
    var differentId = differentNames.id; 

Innym podejściem byłoby to zrobić:

var NameModule = function(){ 

//"private" namemodule variables 
var priv1 = "Hello"; 

//"private namemodule methods 
function privMethod1(){ 
    //TODO: implement 
} 

//"public namemodule variables 
var pub1 = "Welcome"; 

//"public" namemodule methods 
function PubMethod(){ 
    //TODO: pub 
} 

return { 
    pub1 : pub1, 
    PubMethod: PubMethod 
}; 

, a następnie z niego korzystać

var myPubMethod = new NameModule(); 
myPubMethod.PubMethod(); 
var pubVar = myPubMethod.pub1; 

EDIT

Można również skorzystać z tej metody:

var mod = function(){ 
this.modArray = []; 
}; 

mod.prototype = { 

//private variables 
modId: null, 

//public method 
AddToArray: function (obj) { 
    this.modArray.push(obj); 
} 
} 
+0

Nie wydaje się szczególnie przydatna do przechowywania konstruktora i jego prototyp w zamknięciu, to znaczy, że nie można łatwo przedłużyć lub zmodyfikować prototyp później. Trudno dostrzec korzyści dla standardowych deklaracji funkcji i przypisania prototypów. Wzorzec modułu dotyczy tak naprawdę modułów, tj. Jednego z obiektów, a nie konstruktorów. – RobG

+0

@RobG - Pierwszy jest zdecydowanie bardziej samodzielny. Różnica między tą a standardową funkcją polega na tym, że otrzymasz unikalne przedmioty. Drugie podejście jest bardziej zgodne ze wzorem modułu. Mógłbym umieścić trzeci, w którym wykorzystuje prototyp jako podejście rozszerzające. –

+0

@RobG - Jak zaimplementować moduły w javascript? –

Powiązane problemy