2010-09-07 19 views
7

Szukałem kodu źródłowego js dla Scrabb.ly.Co to za wzór znany w JavaScript?

Zauważyłem, że zrobią coś tak jak dla każdego z nich odrębne „klas”:

var Board = (function() { 
    var self = {}; 

    // settings for board 
    self.options = { 
    debug: true, 
    addedPlayTiles: function() {}, 
    clearedPlayTiles: function() {} 
    }; 

    // set to true once the board has been setup 
    self.isSetup = false; 

    // quick access to square elements 
    self.squares = {}; 
    self.squareCount = 0; 

    self.setup = function(options) { 
    self.log("Setting up board!"); 

    // set options 
    _.each(options, function(val, key) { 
     self.options[key] = val; 
    }); 

    return self; 
})(); 

Niektóre kod z połowy zostały pominięte, ale to powinno dać ogólne pojęcie.

  1. Jaki jest cel następujących czynności: (function() { // code })(); Czy jest to wzorzec modułu, o którym mówiłem? Czy to ma na celu utrzymanie globalnej przestrzeni nazw w czystości?
  2. Co oznacza ta linia ?: var self = {} Czy obiekt własny był używany do ujawnienia "publicznych" członków? Jak zdefiniowałbyś prywatną funkcję lub zmienną?
  3. Jak można utworzyć wiele "Tablic", jeśli chcesz?

Odpowiedz

11

Nazywa się to Wzorem Modułu.

Nawiasy wokół funkcji oznaczają, że jest ona oceniana natychmiast po zdefiniowaniu - więc w istocie jest to Singleton. Ponieważ jest to funkcja anonimowa, definicja nie jest zapisywana - nie można więc łatwo tworzyć nowych instancji tego obiektu bez kilku modyfikacji (które zostaną omówione później).

Masz rację, self zawiera "publiczne" metody i właściwości, jak gdyby były. Wszystkie zmienne, które nie są zdefiniowane w self, nie są widoczne na zewnątrz ze względu na właściwości zamknięcia. Jednak wszystkie funkcje zdefiniowane w self nadal mają dostęp do zmiennych prywatnych, ponieważ w JavaScript funkcje utrzymują dostęp do kontekstu (w tym zmiennych), w którym zostały zdefiniowane - z kilkoma wyjątkami .. głównie arguments i this.

Jeśli chcesz zdefiniować wiele instancji tego obiektu, usuń nawiasy (var Board = function() { ... }), a następnie użyj var obj = Board(), aby utworzyć obiekt. Pamiętaj, że nie używa on operatora new.

4

Jako mentioned in the other answer, to jest wzór modułu.

Jest znany również jako wzorzec modułu YUI lub wzoru Yahoo Module, głównie dlatego, że został spopularyzowany przez ten blog artykułu:

Odnośnie pkt 3, Wzór Modułu ma być singletonem. Jednak wzorzec modułu można łatwo przekształcić w wzór konstrukcji. Możesz sprawdzić następującą prezentację Douglas Crockford uzyskać więcej informacji na ten temat:

1

var self = {} powinno mieć wpływu inicjalizacji siebie jako pusty obiekt dosłownym ; jeśli self już istniało, powinno usunąć stare wartości i ponownie zainicjować jako pustą tablicę.

+1

Myślę, że masz na myśli "obiekt", a nie "tablicę"? –

+0

@ Daniel Vassallo: Powinien powiedzieć "literalny przedmiot", dobry połów. –