2013-11-01 8 views
5

Obecnie szukam różnych wzorów dla klas budynków w JavaScript. Ale bez względu na to, jaki wzór widzę, wciąż są pewne rzeczy, których nie jestem pewien.Najlepsza Klasa JavaScript?

var ItemManager = (function() 
{ 
    var p = function() 
    { 
     this.items= []; 
    }; 

    p.prototype.addItem = function(item) 
    { 
     var self = this;  
     self.items.push(item); 
    }; 

    return p; 
}()); 

utworzyć prostą klasę ItemManager ta klasa dostaje funkcję addItem do dodawania pozycji do kolekcji. Teraz tak naprawdę nie chcę, aby zmienne, które reprezentują kolekcję, były publiczne, ta zmienna powinna być prywatna, ale nie widzę żadnego możliwego sposobu użycia prototypowej metody dostępu do prywatnych zmiennych.

Jaka jest najlepsza praktyka w tym przypadku? Po prostu nie używaj zmiennych prywatnych?

+4

obowiązkowe nie ma zajęcia w js rozmowy – rlemon

+0

przyjrzeć http://stackoverflow.com/q/436120/1117720 –

Odpowiedz

-1

jak wspomniano GoldenerAal, nie są one nazywane klas, ale funkcje masz

var ItemManager = function(){ 
.. 
... 
... 

}; 

można mieć:

function ItemManager(){ 
this.items = []; 

function addItem(item){ 
... 
}; 
}; 

można następnie utworzyć instancję ItemManager, tylko gdy trzeba na:

var itemManager = new ItemManager(); 
itemManager.addItem(<something here>); 

http://javascript.crockford.com/private.html zmienne wewnątrz funkcji mają tylko zakres tej funkcji, ta zmienna nie jest zmienną globalną (zmienna statyczna).

6
var ItemManager = function() { 
    var items = []; 

    return { 
      addItem : function(item) { 
       items.push(item); 
      }, 
      removeItem : function() { 
       return items.pop(); 
      } 
    } 
}; 

var myItemManager = new ItemManager(); 

items zmienna zostaje ukryty po wykonaniu ItemManager funkcji, ale addItem i removeItem nadal dzielić dostęp do items. Zobacz Douglas Crockford's article dla zmiennych prywatnych w JavaScript w celu dalszego zbadania.

+1

To działa, ale nie 'instanceof' sprawdzić: http://ideone.com/b9hgi4 – Passerby

+0

Oprócz powyższego komentarza: spowoduje to utworzenie nowego zestawu anonimowych funkcji (przypisanych do właściwości 'addItem' i' removeItem') dla każdego oddzielonego obiektu. – zerkms

+0

@Passerby tak, widzę to ... Postaram się dowiedzieć dlaczego. Dzięki za komentarz. – aga

0

Istnieje several ways mieć zmienne prywatne:

I rzecz symboli, że mogą one nadal znajduje się przy użyciu odbicia (to znaczy nie w pełni ujawniać). Przykład:

var Person = (function() { 
    var nameSymbol = Symbol('name'); 
​ 
    function Person(name) { 
     this[nameSymbol] = name; 
    } 
​ 
    Person.prototype.getName = function() { 
     return this[nameSymbol]; 
    }; 
​ 
    return Person; 
}()); 

Więc jest to możliwe, aby (w rozsądny sposób) zmiennych prywatnych, ale niestety żaden z tych rozwiązań są tak eleganckie, jak chcesz.

Powiązane problemy