2012-09-04 19 views
5

He estado trabajando mucho con JavaScript últimamente y he creado algunas colecciones de funciones grandes. He encontrado la necesidad de tener una funcionalidad secundaria que deseo separar de la biblioteca principal y aún así estar incluida en la biblioteca principal, pero aún no he encontrado una manera lo suficientemente elegante para hacer esto.¿Cuál es la sintaxis de un espacio de nombres/clase de JavaScript dentro del espacio de nombre/clase actual?

Aquí hay un par de ejemplos que utilizo en el momento

por lo que suelen configurar mi biblioteca principal como esto

// Main library 
var animals = function(settings){ 
    // Main library stuff 
} 

Para añadir subclases/funcionalidad sub que se encapsulan por separado, pero aún parte de la biblioteca principal ...

Este es el primer método que utiliza la notación literal del objeto

animals.prototype.dogs = { 
    addDog: function(){ 
     // Can only access the dogs object 
     var test = this; 
    }, 
    removeDog: function(){} 
} 

// Usage of the whole thing 
var animalsInstance = new animals({a: 1, b: 3}); 
animalsInstance.dogs.addDog(); 

Aunque realmente me gusta la sintaxis de esto, nunca puedo usarlo ya que no hay forma de referenciar la instancia de animales dentro de cualquiera de las funciones dentro del objeto de perros. Así me ocurrió con esta notación como un reemplazo

animals.prototype.dogs = function(){ 
    var parent = this; 
    return { 
     addDog: function(){ 
      // The animals instance 
      var test = parent; 
      // The dogs instance 
      var test2 = this; 
     }, 
     removeDog: function(){} 
    } 
} 

// Usage 
var animalsInstance = new animals({a: 1, b: 3}); 
animalsInstance.dogs().addDog(); 

Aunque ahora puedo obtener acceso a la instancia de los animales desde el interior de toda la funcionalidad de las funciones de sub perros No me gusta mucho la forma poco hacky I' lo he hecho. ¿Alguien tiene algún método más limpio?

+6

http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript#1598077 – zerkms

+0

Gracias, creo que la pregunta que escribí fue miss leading, su enlace explica cómo crear una subclase que hereda los métodos básicos. Creo que lo que busco es una forma de separar diferentes grupos de métodos relacionados bajo su propio tipo de espacio de nombres. Es decir, todas las funciones relacionadas con perros en animals.dogs. [inserte cualquier nombre de método aquí]. Como cuando te metes en 40/50 + funciones, comienza a ser engorroso. Mi ejemplo del mundo real fue para un TreeGrid que estaba desarrollando, cada función era relevante para mantenerlo bajo la clase principal TreeGrid, pero necesitaba separar subsecciones de funcionalidad. – Ally

+0

Si no quiere tener todos los métodos, no use la herencia, use la delegación. – zerkms

Respuesta

4

Tal vez su buscando algo como esto ...

Esto le permitirá tener la siguiente sintaxis tinyFramework.Utilities.Storage.setItem() tinyFramework.Elements.Modals.createModal()

var tinyFramework = { 

    Utilities: { 
     Storage: { 
      setItem: function(){ 
      //do stuff 
      }, 

      getItem: function(){ 
      //do stuff 
      } 
     }, 
     Helpers: { 

     } 
    }, 

    Elements: { 

     Modals: { 

      createModal: function(){ 
      }, 
      closeModal: function(){ 
      } 
     } 
    } 
} 
+0

Esto funcionaría ya que solo hay una instancia de tinyFramework, así que puedo hacer referencia a ella desde cualquier lugar y dentro de cualquier función tinyFramework. En mi ejemplo, estaba usando instancias de animales, que es una función para permitir múltiples instancias. Quizás debería incluir toda mi funcionalidad en tinyFramework y hacer referencia a eso en mis instancias de animales. Gracias por el replanteamiento, creo que esta es la mejor manera de crear una biblioteca de funcionalidad. – Ally

+0

Me alegro de poder ayudar, este tipo de objeto puede ser muy útil y fácil de implementar. ¡La mejor de las suertes para ti! – afreeland

Cuestiones relacionadas