Namespace i JavaScript

by Jesper juni 24, 2009 00:21

Efter en årrække med WebForms og server kode, ser jeg nu igen mig selv udvikle, mere og mere komplekse løsninger i JavaScript. Med øget kompleksitet, opstår der et behov for øget struktur. JavaScript er dynamisk, og struktur er derfor ikke en selvfølgelighed, som f.eks. i C#. Man er nød til at gøre et arbejde for at strukturere, og det kan ved første øjekast være ret besværligt. Tag f.eks. det faktum at alle funktioner der ikke får specificeret et scope, bliver egenskaber på Window objektet.

Som jeg tidligere har kodet, har jeg lagt alle funktioner / objektkonstruktører i det scope, og med flere og flere kode biblioteker, så vil der ske et kolaps, og man kan ikke regne med hvilken kode der bliver afviklet. Jeg er ikke den eneste der har oplevet dette – f.eks. har jeg observeret at en meget kendt .NET applikation, tidligere havde en global funktion, der, som jeg husker det, så nogenlunde sådan ud:

function $(id){
    return document.getElementByID(id);
}

// Bruges således:
$("myDiv").innerText = “Hello world”;

Smart ikke? Men pludselig kom et kendt JavaScript API på banen og blev standard: jQuery, og så virkede det ikke efter hensigten længere.

Med andre ord, så vil der blive større og større behov for at scope sin kode – Namespacing. Hvordan gør man så lige det i JavaScript?

Man kan gøre det på flere måder, men jeg foretrækker at konstruerer mit namespace objekt direkte i en selvinitialicerende funktion:

var ICoder = function(){
    return {
        funk1 : function(){ alert("Hello funk1"); },
        funk2 : function(){ alert("Hello funk2"); }
    };
}();

// Brug:
ICoder.funk1();

Ud over at den fremgangsmåde er kompakt, så giver den også et par sidegevinster. Da namespacet er en funktion, kan man erklære private variabler (funktioner og properties), ved at udnytte closure:

var ICoder2 = function(){
    // Private medlemmer:
    var secretValue = "The answer is 42!";
    
    // Public medlemmer:
    return {
        getTheAnswer : function(){
            alert(secretValue);
        }
    };    

}();

// Brug:
ICoder2.getTheAnswer();

// Følgende virker ikke:
alert(ICoder2.secretValue);

Yeps – private members i JavaScript – Det er næsten helt OOP.

Code on…

Tags:

JavaScript

Kommentarer

28-09-2009 08:39:51 #

trackback

Arrays er objekter

Arrays er objekter

ICoder

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  juli 2010  >>
mationtofr
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar

RecentComments

Comment RSS