JavaScript类最佳实践?

时间:2013-11-01 11:03:12

标签: javascript class oop

我目前正在研究在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方法来访问私有变量。

那么这种情况下的最佳做法是什么?只是不使用私有变量?

3 个答案:

答案 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变量会隐藏,但addItemremoveItem仍然可以共享对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 函数内部的变量只具有该函数的作用域,该变量不是全局变量(静态变量)。