JavaScript类的最佳实践?

6

我目前正在研究在JavaScript中构建类的不同模式。无论我看到什么模式,仍然有一些事情我不太确定。

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

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

    return p;
}());

我创建了一个简单的类,这个类有一个函数,可以将任何项添加到集合中。现在我不想让代表集合的变量items公开,这个变量应该是私有的,但我没有看到任何可能使用原型方法来访问私有变量的方式。
那么在这种情况下最佳实践是什么?只是不使用私有变量吗?

4
必须说明,在JavaScript中没有类的调用。 - rlemon
请查看https://dev59.com/anRC5IYBdhLWcg3wAcbU。 - Amine Hajyoussef
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函数后变为隐藏状态,但是addItemremoveItem仍然可以访问items。请参考道格拉斯·克罗克福德在JavaScript中私有变量的文章进行进一步研究。


除了上面的评论之外:这将为每个分离的对象创建一组新的匿名函数(分配给addItemremoveItem属性)。 - zerkms
@路人甲 是的,我看到了... 我会尝试找出原因。感谢您的评论。 - aga
@aga:这很容易 - 因为在每次构造函数调用时,你都会返回一个新对象。 - zerkms
@zerkms 请看下面的代码片段:var a = []; a instanceOf Array; 在这里,我创建了一个新对象,但它仍然是 Array 的实例。为什么会这样呢? - aga
这基本上是我一直以来的做法,但这种模式的问题在于你无法继承它,并且正如之前所述,它总是会创建一个新对象。但还是谢谢! - GoldenerAal
1
因为你正在创建一个 Array 类型对象的实例。请查看 https://dev59.com/CnI-5IYBdhLWcg3wMFQf#1978474 了解详情。 - zerkms

1

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

我更喜欢Symbols,尽管它们仍然可以通过反射找到(即不完全私有)。例如:

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

因此,有可能拥有(相对)私有的变量,但不幸的是,没有一种解决方案像您想要的那样优雅。


-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 函数内部的变量仅在该函数的范围内,该变量不是全局变量(静态变量)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接