2013-11-01 224 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; 
}()); 

所以它可能有(合理的)私有变量,但遗憾的是没有一个解决方案都是一样优雅,只要你愿意。