2009-10-09 6 views
5

J'espaces de noms suis actuellement en utilisant le modèle suivant pour créer des objets et des espaces de noms singleton en Javascript:Javascript:

var Namespace = function() { 

    var priv = { 
     privateVar1: '', 
     privateVar2: '', 
     privateFunction1: function() { 
      //do stuff 
      [...] 
     }, 
     [...] 
    }; 

    var pub = { 
     publicVar1: '', 
     publicFunction1: function() { 
       //do stuff with private functions and variables 
       priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
      [...] 
     }, 
     [...] 
    }; 

    return pub; 
}(); 

J'espère que vous avez l'idée. Existe-t-il un moyen de créer des espaces de noms que vous pensez plus propres ou meilleurs (expliquez pourquoi)?

+0

dupliquer: http: // stackoverflow.com/questions/6549629/préféré-technique-pour-javascript-namespacing (la nouvelle question est plus claire) –

Répondre

5

En fait, tout est une question de sémantique. Si vous divisez votre code en plusieurs fichiers et que vous envisagez d'utiliser un espace de noms général, il est un peu plus facile de faire quelque chose comme ça:

La raison pour laquelle j'aime cette méthode est qu'elle est beaucoup plus modulaire et permet au code de être divisé en plusieurs fichiers et ensuite les compresser facilement en un sans problèmes de dépendances (à moins que vos fonctions d'espacement dépendent l'une de l'autre)

L'inconvénient est qu'il peut parfois sembler un peu brouillon s'il n'est pas utilisé correctement - - Ce que je suppose peut s'appliquer à n'importe quoi.

Dans votre fichier d'espace de noms

var Namespace = {}; 

Dans vos autres fichiers JavaScript qui utilisent l'espace de noms

var Namespace = Namespace === undefined ? {} : Namespace; 

Namespace.stuff = function() { 
    var private = 'foo'; 
    function private_func() { 
    }; 

    this.public = 'bar'; 
    this.public_func = function() { 
    } 
}; 

une application pratique serait:

GUI.js

// Some general GUI 
var GUI = { 
    'MAX_WIDTH': $(window).width(), 
    'MAX_HEIGHT': $(window).height() 
}; 

Toolbar.js

GUI.Toolbar = function (id) { 
    var self = this; 

    function init_visuals() { 
     $(id).click(function() { 
      self.alert_broken(); 
     }); 
    }; 

    function initialize() { 
     init_visuals(); 
    }; 

    this.alert_broken = function() { 
     alert('Broken!'); 
    }; 

    initialize(); 
}; 

menu.js

GUI.Menu = function() { 
}; GUI.Menu.prototype = new GUI.Toolbar(); 

Maintenant, singletons - C'est tout autre argument.

+0

Je pense que votre exemple est cassé. "private" et "public" ne peuvent pas être utilisés comme nom de variable car ils sont réservés: http://javascript.about.com/library/blreserved.htm. Deuxièmement, ni "public" ni "public_func" ne sont accessibles. –

+0

Il n'y pensait probablement pas :) Vous avez tort, public et public_func sont accessibles via Namespace.stuff.public et Namespace.stuff.public_funct. Merci Justin, j'aime mieux ta méthode. Merci à vous aussi Tim, votre exemple peut être combiné avec d'autres modèles et sera utile. –

0

Cela est bon, mais il est préférable de déclarer les variables privées en tant que variables locales dans l'espace de noms, au lieu d'utiliser un objet priv. Avantages: moins de code, packer peut réduire les noms de variables. Essayez d'emballer votre code ici: http://dean.edwards.name/packer/

0

Je pense que votre exemple est très bien et toute cette question concerne principalement le goût. Cependant, je wourld écris comme ceci:

var NAMESPACE = { 

    publicVar1: '', 
    publicFunction1: (function(){ 

     var privateVar1 = ''; 
     var privateVar2 = ''; 
     function privateFunction1() { 
      //do stuff 
      //[...] 
     }; 

     return function(){ 
      //do stuff with private functions and variables 
      priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
     } 
    })() 
} 

D'abord, l'espace de noms doit être tout upercase, comme Douglas Crockford suggère et comme on le voit par YAHOO.

Deuxièmement, je crée NAMESPACE avec ses propriétés directement, pas à travers une fonction anonyme. Mais j'ai créé la fonction publicFunction1 dans une fonction anonyme, donc je peux définir des fonctions privées et des variables en son sein. C'est légèrement différent, parce que la portée est encore plus petite que dans votre exemple. L'avantage est que d'autres fonctions dans le même espace de noms peuvent utiliser les mêmes noms de variables. L'inconvénient est, bien, d'autres fonctions ne partagent pas les mêmes variables avec cette fonction :-)