2013-11-01 51 views
5

Şu anda JavaScript'te yapı dersleri için farklı desenler arıyorum. Ama benim gördüğüm desen yok, hala emin olmadığım bazı şeyler var. JavaScript Sınıfı En İyi Uygulama?

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

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

    return p; 
}()); 

Basit sınıf ItemManager oluşturmak, bu sınıf koleksiyonuna herhangi bir öğeyi eklemek için addItem fonksiyonunu aldık. Şimdi, koleksiyonu temsil eden değişken öğelerin halka olmasını istemiyorum, bu değişken özel olmalı, ancak özel değişkenlere erişmek için bir prototip yöntemi kullanmanın herhangi bir yolunu göremiyorum.

Bu durumda en iyi uygulama nedir? Sadece özel değişkenleri kullanmayın?

+4

Zorunlu js çağrı – rlemon

+0

hiçbir sınıfları http://stackoverflow.com/q/436120/1117720 –

cevap

-1

GoldenerAal belirttiği gibi, bu adlandırılan değildir sınıflar

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

}; 

var ama işlevleri olabilir:

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

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

sonra ItemManager bir örneğini oluşturabilir, yalnızca ihtiyacınız olduğunda için:

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

http://javascript.crockford.com/private.htmlBir işlev içindedeğişkenleri yalnızca bu işlevin kapsamına sahiptir, bu değişken bir global değişken (statik değişken) değildir.

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

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

var myItemManager = new ItemManager(); 

items değişken ItemManager fonksiyon çalıştırıldıktan sonra gizlenir, ancak addItem ve removeItem hala items erişimi paylaşmak. Daha fazla araştırma için JavaScript'deki özel değişkenler için Douglas Crockford's article'a bakın.

+1

Bu işler bir göz vardır almakta, ancak kontrol instanceof' 'başarısız olur: http://ideone.com/b9hgi4 – Passerby

+0

Yukarıdaki yoruma ek olarak: Bu, her ayrılmış nesne için yeni bir adsız işlev kümesi ("addItem" ve "removeItem" özelliklerine atanmış) oluşturacaktır. – zerkms

+0

@Passerby evet, görüyorum ... Nedenini bulmaya çalışacağım. yorumun için teşekkürler. – aga

0

several ways özel değişkenleri olması vardır: Revealing Module Pattern kullanan aga örnekte olduğu gibi

  • Kapaklar,. ES6 sınıflarını kullanıyorsanız, hide private data in the constructor, bana oldukça çirkin görünüyor olabilir. yine de yansıma (yani tamamen özel olan) kullanılarak bulunabilir da
  • [ES6] semboller
  • [ES6] ben Semboller tercih

WeakMap. Örnek:

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

yüzden (makul) özel değişkenleri olması mümkündür, ama çözümlerin maalesef hiçbiri istediğiniz kadar zariftir

.