首页 文章

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

提问于
浏览
0

所以我一直在研究javascript,现在我正在关注闭包 . 我以为我理解了所有的概念,但我显然错过了一些东西 . 出于学习目的,我创建了这个闭包,它基本上就像一个带有Object和整数成员的类 . 代码如下:

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" });

一切都很完美,除了长度:它总是返回零,我想让它返回当前值,就像静态var . _filters var正确返回,它并不总是像长度一样重置,所以我真的不知道这里发生了什么,我认为_length会像_filters一样保持它的状态 . 有什么想法吗?

1 回答

  • 1

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

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

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

相关问题