Javascript:内部数组不会重置为外部对象

Javascript: Internal array is not reset to outer objects

本文关键字:外部 对象 内部 数组 Javascript      更新时间:2023-09-26

如何以正确的方式授予对对象内部属性的访问权限?这就是破坏我的应用程序的地方:

我有一个处理数组的对象(这里简化了):

function ListManager() {
    var list = [],
        add = function (element) {
            list.push(element);
        },
        clear = function () {
            list = [];
        };
    return {
        add: add,
        clear: clear,
        list : list
    };
};

但是当我使用它时,我得到了这个:

var manager = new ListManager();
manager.add("something");
manager.clear();
console.log(manager.list.length); // <= outputs "1"!

通过执行代码可以看出,在clear方法中,list变成了一个新的数组。但从ListManager外的列表列表未清除。

我做错了什么?

这是因为clear设置了var list的值,而不是ListManager()返回对象上的.list的值。您可以使用this:

function ListManager() {
    var list = [],
        add = function (element) {
            this.list.push(element);
        },
        clear = function () {
            this.list = [];
        };
    return {
        add: add,
        clear: clear,
        list : list
    };
}

使用您当前的结构,您可以:

function ListManager() {
    var list = [],
        add = function (element) {
            list.push(element);
        },
        clear = function () {
            list = [];
        };
        getList=function(){
            return list;
        }

    return {
        add: add,
        clear: clear,
        list : list,
        getList: getList
    };
};
var manager = new ListManager();
manager.add("something");
console.log(manager.getList()); // ["something"]
manager.clear();
console.log(manager.getList()); // []
    function ListManager() {
    var list = [],
        add = function (element) {
            this.list.push(element);
        },
        clear = function () {
            this.list = [];
        };
    return {
        add: add,
        clear: clear,
        list : list
    };
};
var manager = new ListManager();
manager.add("something");
manager.clear();
console.log(manager.list.length); // <= now outputs "0"!

正如已经解释的那样,您的问题是,当您执行list = []时,您正在更改局部变量list,但您没有更改this.list,因为它们是两个独立的变量。它们最初引用的是同一个数组,所以如果你修改了数组,而不是给其中一个变量赋值,它们都能看到变化。

就我个人而言,我认为你使用了错误的设计模式来创建这个对象,它只会使事情变得更加复杂,并使你更有可能像你那样制造问题。如果您希望维护外部世界无法访问的私有实例变量,那么这种设计模式可能很有用,但是如果所有内容都是公共的,那么它将创建更复杂的定义和维护。

我的编程目标之一是使用最简单、最干净的方式来表达期望的功能。

因此,由于这个对象中的所有内容都是公共的,并且可以从对象外部访问,因此这要简单得多,并且不会受到您刚才遇到的任何类型的问题的影响:

function ListManager() {
    this.list = [];
    this.add = function(element) {
       this.list.push(element);
    }
    this.clear = function() {
        this.list = [];
    }    
}

或者,甚至可以使用原型:

function ListManager() {
    this.list = [];
}
ListManager.prototype = {
    add: function(element) {
       this.list.push(element);
    },
    clear: function() {
        this.list = [];
    }
};