5

我目前正在研究在 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

3 回答 3

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

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

var myItemManager = new ItemManager();

items变量在函数执行后被隐藏,ItemManager但仍然共享对. 请参阅Douglas Crockford关于 JavaScript 中的私有变量的文章以进行进一步研究。addItemremoveItemitems

于 2013-11-01T11:19:16.127 回答
1

几种方法可以拥有私有变量:

我喜欢符号,尽管它们仍然可以使用反射找到(即不是完全私有的)。例子:

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

所以可能有(合理的)私有变量,但不幸的是,没有一个解决方案像你想要的那样优雅。

于 2016-07-19T03:28:16.613 回答
-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 函数内部的变量只有该函数的范围,该变量不是全局变量(静态变量)。

于 2013-11-01T11:16:49.850 回答