我在javascript中非常简单地挣扎。我想要一个只能通过对象的方法修改的数组。请考虑以下示例:
var Cart = function() {
this.items = [];
}
Cart.prototype.getItems = function() {
return this.items;
}
Cart.prototype.addItem = function(item) {
this.items.push(item);
}
module.exports = Cart;
我希望能够通过addItem方法添加新项目,并通过getItems方法检索项目。我不希望能够以Cart.items.push(item)为例。
我怎样才能实现这个目标?
答案 0 :(得分:1)
使用ES6 WeakMap
,您可以这样做:
var items = new WeakMap();
var Cart = function() {
items[this] = [];
};
Cart.prototype.getItems = function() {
return items[this];
};
Cart.prototype.addItem = function(item) {
items[this].push(item);
};
module.exports = Cart;
答案 1 :(得分:0)
在javascript中,您不拥有私人财产。以下是一些选项:
1 - 调用属性_items
。这是一个众所周知的命名私有财产的惯例;
2 - 使用闭包:
var Cart = function() {
var items = [];
this.getItems = function() {
return items;
};
this.addItem = function(item) {
items.push(item);
};
}
3 - 使用符号。它们不是真正的私人,但很难发现:
var items = Symbol();
var Cart = function() {
this[items] = [];
}
Cart.prototype.getItems = function() {
return this[items];
}
Cart.prototype.addItem = function(item) {
this[items].push(item);
}
4 - 改为使用private-symbol模块。这只适用于node.js / io.js(使用v8 C ++ API),但为您提供真正的私有符号
5 - 使用WeakMap
var items = new WeakMap();
var Cart = function() {
items.set(this, []);
}
Cart.prototype.getItems = function() {
return items.get(this);
}
Cart.prototype.addItem = function(item) {
items.get(this).push(item);
}
答案 2 :(得分:-1)
这是否符合您的要求?
var Cart = function() {
var items = [];
this.getItems = function() {
return items;
};
this.addItem = function(item) {
items.push(item);
};
}
答案 3 :(得分:-2)
您可以通过利用构造函数的scope
来实现该功能。
不是将数组定义为公共属性,而是将其定义为变量:
var Cart = function() {
var items = [];
this.getItems = function() {
return items;
}
this.addItem = function(item) {
items.push(item);
}
this.addAndRetrieve = function(item) {
items.push(item);
return items;
}
}
module.exports = Cart;
然后,您可以通过公开的方法getItems
和addItem
var x = new Cart(),
y = new Cart();
x.addItem(1);
y.addItem(2);
x.getItems(); // [1]
y.getItems(); // [2]
EDIT1 :如果这些是您想要在实例上链接的唯一两种方法,您只需将它们组合在一个新功能中即可实现组合功能。