2012-06-27 9 views
5

Estoy tratando de entender los módulos de JavaScript, pero no estoy seguro de cómo dividir un módulo en otros submódulos. He leído que las funciones anidadas no son realmente una gran idea, debido al rendimiento, entonces ¿cómo puedo dividir una función en un módulo? Por ejemplo, digamos que tengo el siguiente módulo:Patrón de módulo Javascript, funciones anidadas y submódulos

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 está relacionado solo con Editor.build. ¿Debo adjuntar las funciones más pequeñas que componen bigFunction al objeto prototipo bigFunction? Ni siquiera estoy seguro de si eso tendría sentido.

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 
     } 
    }; 
})(); 

¿Alguien puede arrojarme en la dirección correcta aquí? Hay tanta información engañosa en línea, y solo me gustaría una guía definitiva sobre cómo lidiar con este tipo de modularización.

Gracias.

Respuesta

0

Aquí hay un fragmento que utilizo para hacer nombres para una entrada:

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(); }; 
    }(); 

Y entonces lo uso:

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

Otro enfoque sería hacer esto:

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 
}; 

y luego para usarlo

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

EDITAR

También puede tomar este enfoque:

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

mod.prototype = { 

//private variables 
modId: null, 

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

No parece particularmente útil para mantener el constructor y su prototipo en un cierre, que significa que no puede fácilmente extender o modificar el prototipo más tarde. Es difícil ver ningún beneficio para las declaraciones de funciones estándar y la asignación de prototipos. El patrón del módulo se trata realmente de módulos, es decir, uno: de objetos, no de constructores. – RobG

+0

@RobG: el primero es definitivamente más independiente. La diferencia entre eso y una función estándar será que recuperará objetos únicos. El segundo enfoque es más en línea con un patrón de módulo. Podría poner un tercero en el que se use un prototipo como enfoque de extensión. –

+0

@RobG - ¿Cómo implementa sus módulos en javascript? –

Cuestiones relacionadas