gpt4 book ai didi

javascript - 使用闭包在 javascript 中枚举对象属性的静态变量

转载 作者:行者123 更新时间:2023-12-03 11:43:06 25 4
gpt4 key购买 nike

所以我一直在研究 javascript,现在正在研究闭包。我以为我已经理解了所有的概念,但我显然错过了一些东西。出于学习目的,我创建了这个闭包,其行为基本上类似于具有对象和整数成员的类。代码如下:

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 var 正确返回,它并不总是像 length 一样重置,所以我真的不知道这里发生了什么,我认为 _length 会像 _filters 一样保持其状态。有什么想法吗?

最佳答案

当您更新 _length 变量时,它不会更改 x.length 属性。它是在您创建对象时使用长度初始化的,但您从未更新它。您需要将该属性设置为一个从闭包变量返回长度的函数:

function _getLength() {
return _length;
}
...
length: _getLength

然后你可以使用x.length()来获取当前长度。

关于javascript - 使用闭包在 javascript 中枚举对象属性的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26173241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com