JavaScript类最佳实践?
我目前正在研究用JavaScript构建类的不同模式。但是没有matther我看到了什么样的模式,还有一些事情我不是很确定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.
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;
}());