2012-07-04 4 views
3

Je suis un débutant javascript, et je suis venu avec le schéma suivant pour espaces de noms:namespacing Javascript - cette méthode particulière est-elle une bonne pratique?

(function() { 
    var ns = Company.namespace("Company.Site.Module"); 

    ns.MyClass = function() { .... }; 

    ns.MyClass.prototype.coolFunction = function() { ... }; 

})(); 

Company.namespace est une fonction enregistrée par un script qui crée simplement la chaîne d'objets jusqu'au module.

A l'extérieur, une portée non globale:

var my = new Company.Site.Module.MyClass(); 

Je suis particulièrement poser des questions sur la méthode par laquelle je me cache la ns variable d'une portée globale - par une enveloppe fonction anonyme exécutée immédiatement. Je pourrais juste écrire Company.Site.Module partout, mais ce n'est pas sec et un peu en désordre comparé au stockage des ns dans une variable locale.

Que dites-vous? Quels pièges y a-t-il avec cette approche? Y a-t-il une autre méthode considérée comme plus standard?

+0

@ pimvdb Idée astucieuse, mais ça aurait l'air un peu bizarre avec plusieurs extensions pour la classe et les méthodes ... – Max

Répondre

1

Vous n'avez pas besoin de classes de portée comme cela, c'est seulement nécessaire si vous avez des variables globales en dehors de la classe. J'utilise cette approche ...

MyApp.MyClass = function() { 
}; 

MyApp.MyClass.prototype = { 
    foo: function() { 
    } 
}; 

Notez également que j'utilise un littéral d'objet pour une déclaration prototype plus propre

Toutefois, si vous devez scope variables globales, vous pouvez alors faire

(function() { 
    var scopedGlobalVariable = "some value"; 

    MyApp.MyClass = function() { 
    }; 
    MyApp.MyClass.prototype = function() { 
     foo: function() { 
     } 
    }; 
})(); 
1

Votre approche me semble bien.

Cependant, vous pouvez aussi faire un peu différent, en retournant la « classe » de la fonction d'auto-exécution:

Company.Site.Module.MyClass = (function() { 
    var MyClass = function() { ... }; 
    MyClass.prototype.foo = function() { ... }; 
    return MyClass; 
})(); 

Ce bandes au moins tous les préfixes ns.. La fonction d'espace de noms peut toujours être utilisée pour créer les objets, mais en dehors de la fonction auto-exécutable.

+0

Merci! Le problème est que j'ai quelques classes et quelques fonctions libres dans chaque espace de nommage - cependant, il semble être une bonne idée de combiner les vôtres avec les miennes - en créant les classes avec TheClass comme variable locale, en supprimant les ns dans les déclarations de classes, mais ayant toujours ns dehors. Ou pensez-vous que c'est trop? – Max

+0

Cela me semble très raisonnable! – Niko

+0

Upvoting pour l'instant, mais je pense que c'est une habitude sur SO d'attendre un jour pour permettre aux autres de répondre avant de vérifier comme accepté;) – Max

Questions connexes