Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用闭包枚举javascript中对象属性的静态变量_Javascript_Closures_Static Members - Fatal编程技术网

使用闭包枚举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.

所以我一直在研究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变量是正确返回的,它不总是像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?因为数字不是对象。数字在赋值时是复制的,它们不是通过引用访问的。我明白了,所以我的内部函数实际上存储了长度的副本,而不是它的引用。这是有道理的。非常感谢。