Névterek implementálása

A JavaScript nem támogatja a névtereket, azonban objektumok használatával emulálhatjuk a névtereket.

var W3NET;
if (!W3NET) W3NET = {};
else if(typeof W3NET != 'object'){
  throw new Error('A W3NET névtér már létezik, de nem objektum típusú!');
};

W3NET.util = {};
W3NET.widget = {};

Létrehozunk egy fő névteret, amely majd tartalmazni fogja az összes osztályunkat, függvényünket, változókat. A lényeg, hogy ne szennyezzük a globális névteret, mert az nehezen felderíthető hibák forrása lehet. Mielőtt egy üres objektumot rendelnénk a változóhoz, leellenőrizzük, hogy nem létezik-e már ilyen nevű változó. Ha már van ilyen nevű változó, leellenőrizzük az adattípusát is, és kivételt dobunk ha nem objektum az adattípusa. Erre azért van szükség, mert ellenőrzés nélkül észrevétlenül átírhatnánk egy a névterünkkel megegyező nevű változót. Ennek az esélye természetesen nagyon csekély. Ajánlott olyan névtér nevet választani, ami valószínűleg egyedi (a Yahoo! cég például a YUI függvénykönyvtárát a YAHOO névtérbe zárta). Ez esetben a névteret kevesebb kóddal is létrehozhatjuk:

var NEVTERNEVE = window.NEVTERNEVE || {};

A névtérnek szánt globális üres objektum létrehozása után függvényeinket, osztályainkat, változóinkat az objektum tulajdonságaként hozzuk létre.

W3NET.widget.Form = function(){
    this.tulajdonsag;
    var privatLathatosaguTulajdonsag;
    …
    this.publikusMetodus = function(){
    };
    var privateFuggveny = function(){
    }
    …
};
W3NET.widget.Form.prototype. toString = function(){
};

W3NET.widget.TreeList = function(){
…
};

W3NET.util.Xml = {
    getDomDocument : function(){
    },
    getXsltTemplate : function(){
    }
};

var oForm = new W3NET.widget.Form();

Előfordulhat, hogy szükségünk van olyan változóra is, amely elérhető az összes osztályunkból, ám a névtéren kívülről elérhetetlen. Ilyenkor üres objektum helyett egy névtelen függvényt példányosítunk. Ez a módszer a lezáráson alapszik. A belső függvények elérik a külső függvény összes változóját, de azok kívülről nem elérhetők.

var Xml = new (function(){ // névtelen függvény
    var _MSXML_DOM_PROGIDS = new Array( 'Msxml2.DOMDocument.6.0',
                                        'Msxml2.DOMDocument.4.0',
                                        'Msxml2.DOMDocument.3.0',
                                        'Msxml2.DOMDocument',
                                        'Microsoft.XMLDOM'
                                        );
    this.getDomDocument = function(){
    };
...
})(); // a névtelen függvénynek itt a vége

Névterek használata különösen akkor fontos, ha újrahasznosítható kódot írunk, amit más fejlesztők is használni fognak. Manapság nem ritka, hogy a fejlesztők projektjeikhez más programozóktól származó kódot is felhasználnak, amit az oldalba a <script /> taggal olvasnak be. Ha nem használnánk névtereket, könnyen megeshetne, hogy két különböző JavaScript-forrásfájl megegyező nevű globális változót deklarálna.