Javascript:内部数组不会重置为外部对象
Javascript: Internal array is not reset to outer objects
如何以正确的方式授予对对象内部属性的访问权限?这就是破坏我的应用程序的地方:
我有一个处理数组的对象(这里简化了):
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 = [];
}
};
相关文章:
- Javascript从匿名函数访问外部对象属性
- 在内部JavaScript函数中包含外部对象
- 覆盖外部对象's函数在Internet Explorer中使用JavaScript
- 如何使用javascript(和AJAX?)调用外部对象
- 如何将嵌套对象移动到外部对象
- 如何在我的Chrome扩展中包含外部对象
- Javascript外部对象全局
- 访问JS中的外部对象
- scroll在chrome中的svg外部对象内不起作用
- 从$.getJSON调用外部对象
- 将JSONP回调的结果保存到外部对象
- 无法从函数作用域向外部对象添加属性
- 如何在Javascript中访问外部对象上的函数
- 如何在javascript对象中访问外部对象
- 使用dojo.在对象、外部对象的方法中挂起和闭包
- Javascript:内部数组不会重置为外部对象
- 在JavaScript中,如何得到'this'外部对象的对象的方法,该对象是外部对象中数组的元素
- 使用javascript在svg中动态添加外部对象
- Dom外部对象的样式
- 从嵌套函数访问外部对象(使用主干.js