JavaScript类最佳实践?

JavaScript类最佳实践?,javascript,class,oop,Javascript,Class,Oop,我目前正在研究用JavaScript构建类的不同模式。但是没有matther我看到了什么样的模式,还有一些事情我不是很确定 var ItemManager = (function() { var p = function() { this.items= []; }; p.prototype.addItem = function(item) { var self = this; self.items.

我目前正在研究用JavaScript构建类的不同模式。但是没有matther我看到了什么样的模式,还有一些事情我不是很确定

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

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

    return p;
}());
我创建了一个简单的类ItemManager,这个类获得了addItem函数,用于将任何项添加到集合中。现在我真的不希望代表集合的变量项是公共的,这个变量应该是私有的,但是我看不到任何可能的方法来使用原型方法访问私有变量


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

正如Goldeneral提到的,它们不是类,而是函数 你有

var ItemManager = function (){
..
...
...

};
你可以:

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

function addItem(item){
...
};
};
然后,您可以仅在需要时创建ItemManager的实例:

var itemManager = new ItemManager();
itemManager.addItem(<something here>);
var itemmager=new itemmager();
itemManager.addItem();
函数中的变量仅具有该函数的作用域,该变量不是全局变量(静态变量)

执行
itemsmanager
函数后,
items
变量变为隐藏,但
addItem
removietem
仍共享对
项的访问权限。有关进一步的调查,请参阅JavaScript中关于私有变量的部分。

必须有私有变量:

  • 闭包,如aga的示例中所示,它使用。如果你使用ES6类,你可以,尽管我觉得它很难看
  • [ES6]符号
  • [ES6]WeakMap
我喜欢符号,尽管它们仍然可以通过反射找到(也就是说,不完全是私有的)。例如:

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

因此,有(合理的)私有变量是可能的,但不幸的是,没有一个解决方案像您所希望的那样优雅。

js call中没有类除了上面的注释外,还需要看一看:这将创建一组新的匿名函数(分配给
addItem
removietem
属性)每一个分离的物体。@路人是的,我看到了。。。我会试着找出原因。谢谢你的评论。@aga:这很简单,因为每次调用构造函数都会返回一个新的值object@zerkms看看下面的代码:
var a=[];数组的实例
在这里我创建了一个新对象,但它仍然是
数组的实例。为什么它能工作?@aga:因为您正在创建
Array
type对象的实例。查看详细信息
var Person = (function() {
    var nameSymbol = Symbol('name');
​
    function Person(name) {
        this[nameSymbol] = name;
    }
​
    Person.prototype.getName = function() {
        return this[nameSymbol];
    };
​
    return Person;
}());