2013-11-01 180 views
5

我目前正在研究用JavaScript構建類的不同模式。但不管我看到什麼模式,還有一些我不確定的事情。JavaScript類最佳實踐?

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

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

    return p; 
}()); 

我創建簡單的類ItemManager,這個類有功能的addItem添加任何項目到集合中。現在我不想讓表示集合的變量項目公開,這個變量應該是私有的,但我沒有看到任何可能的方式來使用原型方法來訪問私有變量。

那麼這種情況下的最佳做法是什麼?簡單地不要使用私有變量?

+4

強制沒有類在js電話 – rlemon

+0

看看http://stackoverflow.com/q/436120/1117720 –

回答

-1

爲GoldenerAal提到,他們不叫類,但是功能 你有

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

}; 

你可以有:

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

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

您可以創建ItemManager的實例,只有當你需要到:

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

http://javascript.crockford.com/private.html一個函數內的變量只有該函數的範圍,該變量不是全局變量(靜態變量)。

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

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

var myItemManager = new ItemManager(); 

items變量變成ItemManager功能執行後隱藏,但addItemremoveItem仍然共享訪問items。有關JavaScript中的私有變量,請參閱Douglas Crockford's article以供進一步調查。

+1

這個工程,但會''instanceof'檢查失敗:http://ideone.com/b9hgi4 – Passerby

+0

除了上面的註釋之外:這將爲每個分隔的對象創建一組新的匿名函數(分配給'addItem'和'removeItem'屬性)。 – zerkms

+0

@Passerby是的,我明白了......我會試着找出原因。謝謝你的評論。 – aga

0

several ways有私有變量:

我喜歡符號,儘管它們仍然可以使用反射(即,不完全私有的)中找到。例如:

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

所以它可能有(合理的)私有變量,但遺憾的是沒有一個解決方案都是一樣優雅,只要你願意。