我目前正在研究在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 ,用于将任何项添加到集合中。现在我真的不希望表示集合的变量项是公共的,这个变量应该是私有的,但我没有看到任何可能的方法来使用prototyped方法来访问私有变量。
那么这种情况下的最佳做法是什么?只是不使用私有变量?
答案 0 :(得分:6)
var ItemManager = function() {
var items = [];
return {
addItem : function(item) {
items.push(item);
},
removeItem : function() {
return items.pop();
}
}
};
var myItemManager = new ItemManager();
执行items
功能后, ItemManager
变量会隐藏,但addItem
和removeItem
仍然可以共享对items
的访问权限。有关进一步调查的信息,请参阅JavaScript中私有变量的Douglas Crockford's article。
答案 1 :(得分: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;
}());
因此可以拥有(合理的)私有变量,但不幸的是,没有一种解决方案像你一样优雅。
答案 2 :(得分:-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 函数内部的变量只具有该函数的作用域,该变量不是全局变量(静态变量)。