使用闭包枚举javascript中对象属性的静态变量
所以我一直在研究javascript,现在我在研究闭包。我以为我已经理解了所有的概念,但我显然遗漏了一些东西。 出于研究目的,我创建了这个闭包,它的行为基本上类似于一个包含对象和整数成员的类。代码如下:使用闭包枚举javascript中对象属性的静态变量,javascript,closures,static-members,Javascript,Closures,Static Members,所以我一直在研究javascript,现在我在研究闭包。我以为我已经理解了所有的概念,但我显然遗漏了一些东西。 出于研究目的,我创建了这个闭包,它的行为基本上类似于一个包含对象和整数成员的类。代码如下: var AllFilters = (function () { var _length = 0; var _filters = {}; //Return new length. //Overwrites if exists.
var AllFilters = (function () {
var _length = 0;
var _filters = {};
//Return new length.
//Overwrites if exists.
function _addFilter(filter) {
_filters[filter.name] = filter;
_length++; //test if it was actually incremented...
}
//Remove property from object.
//Returns the removed propety value, or undefinned.
function _removeFilter(filter) {
var removed;
if (filter.name !== undefined) {
//Removed based on filter object;
removed = _filters[filter.name];
delete _filters[filter.name];
} else {
//Removed based on filter name;
removed = _filters[filter];
delete _filters[filter];
}
_length--; //teste if it was actually deleted...
return removed;
}
//Param = filter name;
//Returns undefined or filter;
function _getFilter(filter) {
return _filters[filter];
}
//Return all filters in an array.
function _getAsArray() {
var arr = [];
for (var filter in _filters) {
if (_filters.hasOwnProperty(filter)) {
arr.push(_filters[filter]);
}
}
return arr;
}
return function () {
return {
addFilter: _addFilter,
removeFilter: _removeFilter,
getFilter: _getFilter,
getAsArray: _getAsArray,
length: _length
};
};
}());
使用:
x = AllFilters();
x.addFilter({ name: "a", foo: "bar" });
x.addFilter({ name: "b", foo: "baz" });
x.addFilter({ name: "c", foo: "qux" });
除了长度之外,一切都很完美:它总是返回零,我想让它返回当前值,就像一个静态变量一样。_filters变量是正确返回的,它不总是像length那样重置,所以我真的不知道这里发生了什么,我想_length会像_filters一样保持它的状态。有什么想法吗?当您更新
\u length
变量时,它不会更改x.length
属性。创建对象时已使用长度初始化,但从未更新。您需要将该属性设置为从闭包变量返回长度的函数:
function _getLength() {
return _length;
}
...
length: _getLength
然后你可以使用
x.length()
来获取当前的长度。该死的,我已经试过了,但是没有用。现在我意识到,当我把x.length()放在一个FCUnition中时,我调用的是x.length而不是x.length()。。。我仍然不太明白为什么仅仅使用变量不起作用。。如果我使用filters:_filters并将其作为x.filters获取,则返回的对象是最新的,那么为什么不是length?因为数字不是对象。数字在赋值时是复制的,它们不是通过引用访问的。我明白了,所以我的内部函数实际上存储了长度的副本,而不是它的引用。这是有道理的。非常感谢。