2009-10-09 13 views
5

obecnie używam następujący wzór do tworzenia nazw obiektów i singleton w JavaScript:Javascript: przestrzenie nazw

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; 
}(); 

Mam nadzieję, że pomysł. Czy istnieje sposób na tworzenie przestrzeni nazw, które uważasz za czystsze lub lepsze (wyjaśnij dlaczego)?

+0

duplikat: http: // stackoverflow.com/questions/6549629/preferred-technique-for-javascript-namespacing (nowsze pytanie jest jaśniejsze) –

Odpowiedz

5

Właściwie to wszystko dotyczy semantyki. Jeśli dzielisz kod na kilka plików i planujesz korzystanie z ogólnej przestrzeni nazw, to zrobienie czegoś takiego jest nieco łatwiejsze:

Powodem, dla którego lubię tę metodę jest to, że jest ona dużo bardziej modułowa i pozwala na kodowanie być podzielone na kilka plików, a następnie tak samo łatwo skompresować je do jednego bez problemów związanych z zależnością (chyba, że ​​funkcje zależą od siebie).

Wadą tego jest to, że czasami może być nieco niechlujny, jeśli jest używany niepoprawnie - - Które, jak sądzę, może odnosić się do wszystkiego.

W pliku namespace

var Namespace = {}; 

W innych plików JavaScript, które są przy użyciu nazw

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

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

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

Niektóre praktyczne zastosowanie byłoby:

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(); 

Teraz singletons - To cały kolejny argument.

+0

Myślę, że twój przykład jest zepsuty. "private" i "public" nie mogą być użyte jako nazwa zmiennej, ponieważ są zarezerwowane: http://javascript.about.com/library/blreserved.htm. Po drugie, ani "public", ani "public_func" nie są osiągalne. –

+0

Prawdopodobnie nie pomyślał o tym :) Nie masz racji, public i public_func są dostępne za pośrednictwem Namespace.stuff.public i Namespace.stuff.public_funct. Dzięki Justin, najbardziej lubię twoją metodę. Dzięki tobie Tim, twój przykład może być połączony z innymi wzorami i będzie przydatny. –

0

To jest dobre, ale lepiej zadeklarować zmienne prywatne jako zmienne lokalne w przestrzeni nazw, zamiast używać jednego obiektu priv. Zalety: mniej kodu, pakujący może zmniejszyć nazwy zmiennych. Spróbuj spakować kod tutaj: http://dean.edwards.name/packer/

0

Myślę, że twój przykład jest w porządku, a to całe pytanie dotyczy głównie gustu. Jednak wourld piszę to tak:

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); 
     } 
    })() 
} 

Przede wszystkim, nazw powinno być wszystko upercase, jak Douglas Crockforda sugeruje i jak widać przez Yahoo.

Po drugie, tworzę NAMESPACE z jego właściwościami bezpośrednio, nie poprzez anonimową funkcję. Ale utworzyłem funkcję publicFunction1 w ramach funkcji anonimowej, dzięki czemu mogę zdefiniować prywatne funkcje i zmienne w niej zawarte. To trochę inaczej, ponieważ zasięg jest jeszcze mniejszy niż w twoim przykładzie. Zaletą jest to, że inne funkcje w obrębie tej samej przestrzeni nazw mogą używać tych samych nazw zmiennych. Wadą jest, cóż, inna funkcja nie dzieli tych samych zmiennych z tą funkcją :-)

Powiązane problemy